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&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> 
+0

[如何匹配针对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

+0

嗨@mjalajel你最终解决了你的问题吗?我很想知道结果。谢谢 – mils 2016-05-24 23:09:31

在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%& ......

+0

毫米将不起作用,因为他没有计划自己匹配条款 - 而是条款的顺序。 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

+0

这将如何工作?你能否添加一个分析链的例子? – mjalajel 2016-05-31 12:05:48

+0

另外,自动短语标记器需要一个短语列表,有没有一种方法来做到这一点,没有预定义的短语列表? – mjalajel 2016-05-31 12:07:38

+0

实施例为分析链: ' ' 以及用于发送所述搜索术语 “带状疱疹” 查询解析器(通过使用这种方法你不需要使用预定义的短语列表): 例如: 'term = banana republic' 你会想要这样的东西。 '短语=(香蕉)(香蕉*)(*)' – 2016-06-09 13:39:26