我正在实施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
任何想法我做错了什么?
答案 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"
)来获取Ricahard
和Chase
彼此靠近的文档。如果您还希望查找Richard X. Chase
,则可以使用text:"richard chase"~1
。
答案 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
由于不会分析字符串类型并将其原样存储,因此只有确切的查询才会匹配它们。