2012-01-19 57 views
2

我想爲SOLR查詢中的每個詞啓用​​「startsWith」搜索,但也能夠執行詞組搜索(用引號引用)。 對於前綴搜索,我首先添加了後綴「*」。該解決方案允許前綴搜索和詞組搜索,但我不喜歡這種解決方案,因爲它是通配符搜索,通配符搜索不會分析術語。對Solr中的EdegeNGram分析和詞組搜索的支持3.4.0

所以我只在索引上啓用了EdgeNgramFilterFactory。前綴搜索工作正常,但確切的短語搜索不再工作。

是否有人知道如何啓用短語搜索,即使啓用了EdgeNgram?

謝謝!

這裏是schema.xml中

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="back" /> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldType> 

我也注意到,使用WordDelimiterFilterFactory當高亮不能很好地執行了。

+0

它可以幫助您是否發表您的schema.xml中,我們可以看到你在做什麼。 –

回答

5

短語搜索不起作用,因爲EdgeNGram生成附加的詞並增加了詞的每個塊的詞位置(令人驚訝)。短語預計是精確的,這意味着兩個連續詞語之間的距離(slops)是1.但大塊索引文本看起來不同。想象一下,您使用<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" side="front"/>爲文本「Hello World」建立了索引。然後索引文本看起來像「他hell hell hello wo wor worl世界」。你會找到「hell hell」這個詞,而不是「hello world」。

enter image description here

正如你可以讓字與字之間有一定距離,通過增加QS查詢分析器(dismax)的參數的選項。

但是,「不精確的詞組」搜索可能是不可接受的,因爲您會發現像「hel hell」這樣的其他意外短語。

更好的選擇是use a separate field for ngrams。在這種情況下,文本將被索引在兩個字段中,並且ngrams不會破壞原始文本。

2

您可以使用兩個字段 - 一個用於前綴和後綴搜索,另一個用於精確匹配。

<field indexed="true" name="myfield_edgy"  type="edgy"/> 
    <field indexed="true" name="myfield_exactmatch" type="exactmatch"/> 
    <copyField source="myfield_exactmatch" dest="myfield_edgy"/> 

現在,你可以在這兩個領域的搜索,甚至使用不同的提升,即在myfield_exactmatch更高排名的比賽。

0

另一個選擇是升級到3.6.0和現在一樣通配符不妨礙被分析查詢