Solr:字段值的完全匹配

mja*_*jel 5 solr

我正在尝试对存储的值(而不是查询值)执行精确匹配。

我的索引数据类似于:“香蕉共和国”

我需要以下查询来匹配:

  • 香蕉共和国的衬衫
  • 香蕉共和国物品
  • 东西香蕉共和国和其他东西

这些应该匹配:

  • 香蕉不是共和国
  • 香蕉是好水果
  • 智利共和国

我的场景实际上很简单,并且可以使用类似于以下的查询的 SQL 轻松实现:query_string LIKE '%stored_val%'但我无法配置分析器来执行它。我确信EdgeNGramFilter可以实现这一点,但是创建长度超过 30 个字符的 ngram 会非常昂贵。

我当前的实现是:在索引分析器中,使用solr.KeywordTokenizerFactory. 在查询分析器中,使用solr.ShingleFilterFactory(2-4 个标记)。使用分析工具时一切正常。但是使用查询 API,查询被转换为:

rawquerystring: "match_name:"banana republic"",
parsedquery_toString: "match_name:"(banana bananarepublic) republic""
Run Code Online (Sandbox Code Playgroud)

这与我存储的令牌“bananarepublic”不匹配

我的分析链如下所示:

  <fieldType name="singletoken" class="solr.TextField">
    <analyzer type="index">
      <charFilter class="solr.MappingCharFilterFactory" mapping="../../common-config/mapping-ISOLatin1Accent.txt"/> <!-- map accented letters to their ascii equivilants -->
      <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory" />
      <filter class="solr.PatternReplaceFilterFactory" pattern="[^A-Za-z0-9&amp; ]" replacement=" "/>
      <filter class="solr.PatternReplaceFilterFactory" pattern="(^\s+|\s+$)" replacement=""/> <!-- join everything in a single token with no spaces -->
    </analyzer>
    <analyzer type="query">
      <charFilter class="solr.MappingCharFilterFactory" mapping="../../common-config/mapping-ISOLatin1Accent.txt"/> <!-- map accented letters to their ascii equivilants -->
      <tokenizer class="solr.WhitespaceTokenizerFactory" />
      <filter class="solr.WordDelimiterFilterFactory" /> <!-- using all default options from: https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory -->
      <filter class="solr.LowerCaseFilterFactory" />
      <filter class="solr.PatternReplaceFilterFactory" pattern="[^A-Za-z0-9&amp; ]" replacement=" "/>
      <filter class="solr.TrimFilterFactory" />
      <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4" outputUnigrams="true" tokenSeparator="" />
    </analyzer>
  </fieldType>
Run Code Online (Sandbox Code Playgroud)

Ram*_*iny 0

在 4.x 和 trunk 中,mm 的默认值由 q.op 参数决定(q.op=AND => mm=100%;q.op=OR => mm=0%)。请记住,默认运算符受 schema.xml 条目的影响。在旧版本的 Solr 中,默认值为 100%(所有子句必须匹配)

您在查询中使用了此语法吗?

your_domain:8983/solr/select/?q=banana+republic&defType=dismax&q.op=AND&...

或者

your_domain:8983/solr/select/?q=banana+republic&defType=dismax&mm=100%&...