繁体   English   中英

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"/>

我们的目标是对文档进行排序

  1. 前缀= 9999,最新文档(最新修改)在前
  2. 前缀= 1004或前缀= 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,并且评分应起作用。 但这似乎并非如此! 请帮助我们:-)

所以我们找到了解决方案!

  1. 创建您自己的相似性(一个简单的Java类),有关如何更好和更简单的描述,请阅读如何使用Eclipse为SOLR / Lucene编译自定义相似性类

我们使用的课程

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;
}

}
  1. 用您的相似性创建一个简单的jar
  2. 将jar复制到我们使用的任何文件夹到您的solr服务器中: SOLRFOLDER/solr-4.8.0/example/solr/dih

下一步需要对您拥有的每个集合进行操作!

  1. 在以下SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml编辑solrconfig.xml: SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
    添加<lib dir="../dih" regex=".*\\.jar" />以导入自定义jar
  2. 在同一文件夹中编辑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>

在这里,您可以定义自己的字段类型(整数,字符串和日期),这些字段类型将使用新的相似类来返回类似MyNewSimilarityClass中定义的提升值。

  1. 现在,通过将其类型设置为您创建的字段,来编辑要使用自定义相似性的字段。
    来自: <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" />
  2. 重新启动solr服务器并享受您的提升:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM