11

I am implementing a SOLR search. When I type in e.g Richard Chase I get all the Richards in the index and all the Chases, like Johnny Chase etc.. when actually I only want to return all the names that match BOTH Richard AND Chase.

my config settings are

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

and my query searches text field

text:Richard Chase

any ideas what I'm doing wrong?

4

4 回答 4

13

您正在使用遵守字边界规则的StandardTokenizerFactory

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

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

Richard Chase要返回仅包含Richard Chase确切内容的文档,那么您应该使用KeywordTokenizerFactory

但正如你提到的,你想要Richard John Chase而不是Johnny Chase ,它告诉我你想要 RichardChase的匹配项。

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

于 2013-08-14T06:38:57.647 回答
8

您必须使用 PhraseQuery ( text:"Richard Chase") 来获取两者RicahardChase彼此靠近的文档。如果你还想找到,比如说,Richard X. Chase你可以使用text:"richard chase"~1.

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

于 2014-11-12T21:56:10.150 回答
2

对于完全匹配,您可以在 solrconfig.xml 中将查询解析器的 mm(Minimum "Should" Match) 参数设置为 100%

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

这指定了查询中必须匹配的最小子句数。或者您可以在请求的查询时覆盖此参数(q.mm)

于 2017-01-10T07:30:10.513 回答
0

另一种选择是使用 copyField 将值复制textstring类型字段,

<field name="text_orig" type="string" />
<copyField source="text" dest="text_orig" maxChars="1024"/>

当您只需要进行完全匹配时,请使用text_orig查询中的字段:

text_orig:"Richard Chase"

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

于 2020-11-16T07:52:58.040 回答