Solr:字段值的完全匹配
我试图在存储的值(而不是查询值)上执行完全匹配。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""
不符合我保持令牌“香蕉*”
我的分析链的样子:
<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>
在4.x版并且trunk的默认值由q.op参数决定(q.op = AND => mm = 100%; q.op = OR => mm = 0%)。请记住,缺省操作符受到schema.xml条目的影响。在较旧版本的Solr中,默认值为100%(所有子句必须匹配)
您是否在查询中使用了此语法?
您的网域:8983/Solr的/选择/ Q =香蕉+*& DEFTYPE = dismax & q.op = AND & ......
OR
您的网域:8983/Solr的/选择/? q =香蕉+*& DEFTYPE = dismax &毫米= 100%& ......
毫米将不起作用,因为他没有计划自己匹配条款 - 而是条款的顺序。 SingleFactory(如链接问题中所述,这是重复的)将解决此问题。他还包括了几个示例查询,其中包括他们不应该匹配的文本。毫米不会解决这个问题。 – MatsLindh 2014-11-23 16:18:10
有没有办法解决这个问题,而不是诉诸定制query Tokenizers
,因为问题在于标记化阶段。
让说,我们有这句话:banana republic
我们要索引和查询准确的词组。 什么是实际发生的事情是:
指数时间:时Solr的被索引banana republic
标记生成器将这个短语分成两个独立的短语,因此该指数将这个样子
短语:banana
短语:republic
查询时间: 在查询的时候,您还将搜索两个分离由OR
操作加入的汇率短语。
你真正需要的是这样的:
指数:短语:banana republic
为一个令牌。
查询:搜索词组:banana republic
为一个令牌。
最好的解决方案是使用是使用自定义短语断词像这样的://计算器:https://github.com/lucidworks/auto-phrase-tokenfilter
[如何匹配针对SOLR/Lucene的搜索字符串的子集(HTTP的可能重复。 com/questions/4882481/how-to-match-against-subssets-of-a-search-string-in-solr-lucene) – MatsLindh 2014-11-23 14:27:09
嗨@mjalajel你最终解决了你的问题吗?我很想知道结果。谢谢 – mils 2016-05-24 23:09:31