按字段值和最新日期内的 Solr 提升查询
Solr boost query by field value and inside newest date
我们的 schema.xml 中有以下设置:
<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" omitTermFreqAndPositions="true"/>
...
<field name="prefix" type="string" indexed="true" stored="true" omitTermFreqAndPositions="true"/>
我们的目标是按
对文档进行排序
- prefix=9999 最新文档(最后修改)在前
- prefix=1004 或 prefix=1005,最新文档(最后修改)在前
我们的代码:
{!boost b=recip(ms(NOW,last_modified),3.16e11,1,1)}prefix:9999^1000000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1004^600000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1005^600000
结果:
上面的查询没有按预期工作!
我们认为 omitTermFreqAndPositions=true 将强制阻止 ITF,计分应该有效。但似乎并非如此!
请帮助我们:-)
所以我们找到了解决办法!
- 创建你自己的相似度(一个简单的javaclass)
如需更好更简单的说明,请阅读 How to compile a custom similarity class for SOLR / Lucene using Eclipse
我们用的class
package com.luxactive;
import org.apache.lucene.index.FieldInvertState;
import org.apache.lucene.search.similarities.DefaultSimilarity;
public class MyNewSimilarityClass extends DefaultSimilarity {
@Override
public float coord(int overlap, int maxOverlap) {
return 1.0f;
}
@Override
public float idf(long docFreq, long numDocs) {
return 1.0f;
}
@Override
public float lengthNorm(FieldInvertState arg0) {
return 1.0f;
}
@Override
public float tf(float freq) {
return 1.0f;
}
}
- 用你的相似度创建一个简单的 jar
- 将 jar 复制到任何文件夹到你的 solr 服务器,我们使用:
SOLRFOLDER/solr-4.8.0/example/solr/dih
需要对您拥有的每个集合执行后续步骤!
- 编辑 solrconfig.xml 于:
SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
添加<lib dir="../dih" regex=".*\.jar" />
导入自定义jar
- 编辑同一文件夹中的schema.xml
添加以下内容
<!-- DEFAULT Factory for custom com.luxactive.MyNewSimilarityClass -->
<similarity class="solr.SchemaSimilarityFactory"/>
<!-- TYPE String -->
<fieldType name="no_term_frequency_string" class="solr.StrField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
<!-- TYPE Date -->
<fieldType name="no_term_frequency_date" class="solr.TrieDateField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
<!-- TYPE Int-->
<fieldType name="no_term_frequency_int" class="solr.TrieIntField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
在这里您可以定义自己的字段类型(整数、字符串和日期),它们使用新的相似度 class,这将 return 提升值,如 MyNewSimilarityClass 中定义的那样。
- 现在编辑您想要使用自定义相似度的字段,方法是将它们的类型设置为您创建的类型。
来自:<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" />
收件人:<field name="last_modified" type="no_term_frequency_date" indexed="true" stored="true" multiValued="false" />
- 重新启动 solr 服务器并享受你的提升:)
我们的 schema.xml 中有以下设置:
<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" omitTermFreqAndPositions="true"/>
...
<field name="prefix" type="string" indexed="true" stored="true" omitTermFreqAndPositions="true"/>
我们的目标是按
对文档进行排序- prefix=9999 最新文档(最后修改)在前
- prefix=1004 或 prefix=1005,最新文档(最后修改)在前
我们的代码:
{!boost b=recip(ms(NOW,last_modified),3.16e11,1,1)}prefix:9999^1000000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1004^600000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1005^600000
结果: 上面的查询没有按预期工作!
我们认为 omitTermFreqAndPositions=true 将强制阻止 ITF,计分应该有效。但似乎并非如此! 请帮助我们:-)
所以我们找到了解决办法!
- 创建你自己的相似度(一个简单的javaclass) 如需更好更简单的说明,请阅读 How to compile a custom similarity class for SOLR / Lucene using Eclipse
我们用的class
package com.luxactive;
import org.apache.lucene.index.FieldInvertState;
import org.apache.lucene.search.similarities.DefaultSimilarity;
public class MyNewSimilarityClass extends DefaultSimilarity {
@Override
public float coord(int overlap, int maxOverlap) {
return 1.0f;
}
@Override
public float idf(long docFreq, long numDocs) {
return 1.0f;
}
@Override
public float lengthNorm(FieldInvertState arg0) {
return 1.0f;
}
@Override
public float tf(float freq) {
return 1.0f;
}
}
- 用你的相似度创建一个简单的 jar
- 将 jar 复制到任何文件夹到你的 solr 服务器,我们使用:
SOLRFOLDER/solr-4.8.0/example/solr/dih
需要对您拥有的每个集合执行后续步骤!
- 编辑 solrconfig.xml 于:
SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
添加<lib dir="../dih" regex=".*\.jar" />
导入自定义jar - 编辑同一文件夹中的schema.xml
添加以下内容
<!-- DEFAULT Factory for custom com.luxactive.MyNewSimilarityClass -->
<similarity class="solr.SchemaSimilarityFactory"/>
<!-- TYPE String -->
<fieldType name="no_term_frequency_string" class="solr.StrField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
<!-- TYPE Date -->
<fieldType name="no_term_frequency_date" class="solr.TrieDateField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
<!-- TYPE Int-->
<fieldType name="no_term_frequency_int" class="solr.TrieIntField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
在这里您可以定义自己的字段类型(整数、字符串和日期),它们使用新的相似度 class,这将 return 提升值,如 MyNewSimilarityClass 中定义的那样。
- 现在编辑您想要使用自定义相似度的字段,方法是将它们的类型设置为您创建的类型。
来自:<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" />
收件人:<field name="last_modified" type="no_term_frequency_date" indexed="true" stored="true" multiValued="false" />
- 重新启动 solr 服务器并享受你的提升:)