2014-11-23 214 views
2

我試圖在存儲的值(而不是查詢值)上執行完全匹配。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

回答

0

在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

0

有沒有辦法解決這個問題,而不是訴諸定製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

實施例爲分析鏈: '<字段類型名稱= 「brands_search」 類= 「solr.TextField」> <分析器類型= 「索引」> < - - 過濾器 - > <分析器類型= 「查詢」> <! - 標記生成器和過濾器 - > ' 以及用於發送所述搜索術語 「帶狀皰疹」 查詢解析器(通過使用這種方法你不需要使用預定義的短語列表): 例如: 'term = banana republic' 你會想要這樣的東西。 '短語=(香蕉)(香蕉共和國)(共和國)' – 2016-06-09 13:39:26