在SOLR搜索上执行精确匹配

时间:2013-08-14 06:20:39

标签: solr

我正在实施SOLR搜索。当我输入例如Richard Chase时,我得到了 索引中的所有理查兹和所有的追逐者,比如约翰尼·蔡斯等......实际上我只想归还所有与理查德和蔡斯相匹配的名字。

我的配置设置是

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

我的查询搜索文本字段

text:Richard Chase

任何想法我做错了什么?

4 个答案:

答案 0 :(得分:9)

您使用的是StandardTokenizerFactory,其符合Word Boundary rules

这意味着你的单词会在空格上分开。

如果你想要一个真正的完全匹配,即

Richard Chase要返回仅包含Richard Chase的文档,那么您应该KeywordTokenizerFactory

但正如你所说,你想要 Richard John Chase 而不是 Johnny Chase ,它告诉我你想要Richard 的追逐

您可以搜索Richard AND Chase或将schema.xml中的默认运算符更改为AND而不是OR。请注意此设置是全局的。

答案 1 :(得分:3)

您必须使用PhraseQuery(text:"Richard Chase")来获取RicahardChase彼此靠近的文档。如果您还希望查找Richard X. Chase,则可以使用text:"richard chase"~1

请参阅http://www.solrtutorial.com/solr-query-syntax.html

答案 2 :(得分:0)

对于完全匹配,您可以在solrconfig.xml中将查询解析器的mm(最小&#34;应该&#34;匹配)参数设置为100%

<str name="mm">100%</str>

这指定了查询中必须匹配的最小子句数。或者您可以在请求

中的查询时覆盖此参数(q.mm)

答案 3 :(得分:0)

另一种选择是使用copyField将methodOnd()的值复制到text类型的字段中,

string

仅需要完全匹配时,请在查询中使用<field name="text_orig" type="string" /> <copyField source="text" dest="text_orig" maxChars="1024"/> 字段:

text_orig

由于不会分析字符串类型并将其原样存储,因此只有确切的查询才会匹配它们。