Performing EXACT match on SOLR search

人走茶凉 提交于 2020-01-01 09:42:24

问题


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?


回答1:


You are using StandardTokenizerFactory, which adheres to Word Boundary rules.

This would mean that your words get split on spaces.

if you want a real exact match, i.e

Richard Chase to return documents containing only Richard Chase exactly, then you should you KeywordTokenizerFactory.

But as you mention, you want Richard John Chase but not Johnny Chase, it tells me that you want matches for Richard and Chase.

You could either search for Richard AND Chase or change your default operator in schema.xml to be AND instead of OR. Beware that this setting is global.




回答2:


You have to use PhraseQuery (text:"Richard Chase") to get documents where both Ricahard and Chase are near to each other. If you want also to find, say, Richard X. Chase you can use text:"richard chase"~1.

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




回答3:


For exact match you can set mm(Minimum "Should" Match) parameter of your query parser to 100% in your solrconfig.xml

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

This specifies a minimum number of clauses that must match in a query. Or you can override this parameter (q.mm) at query-time in request



来源:https://stackoverflow.com/questions/18224527/performing-exact-match-on-solr-search

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!