我正在尝试对存储的值(而不是查询值)执行精确匹配。
我的索引数据类似于:“香蕉共和国”
我需要以下查询来匹配:
这些应该不匹配:
我的场景实际上很简单,并且可以使用类似于以下的查询的 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& ]" 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& ]" replacement=" "/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4" outputUnigrams="true" tokenSeparator="" />
</analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)
在 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%&...