2010-08-23 71 views
6

我是Solr的初學者,遇到不必要的字符進入查詢結果的問題。例如,當我搜索「foo酒吧」時,我用「'foo'bar」獲得了內容等。我只想要精確匹配。據我所知,這可以在schema.xml文件中設置。 我的內容字段類型:Solr查詢/現場分析器

<fieldtype name="textNoStem" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldtype> 

如果您知道解決方案,請讓我知道。 親切的問候。

+0

爲了澄清,「foo酒吧」不應該匹配「'foo'酒吧」,因爲foo被單引號包圍,「foo酒吧」不應該匹配「foo」,因爲它缺少「酒吧」。你是這個意思嗎? – 2014-07-16 18:36:55

回答

13

對於這兩種分析儀,第一行應該是標記器。標記器用於將文本分割爲更小的單位(大部分時間是單詞)。根據您的需要,WhitespaceTokenizerFactory可能是正確的選擇。

如果你想絕對精確匹配,你不需要任何過濾器後的標記。但是,如果您不希望搜索區分大小寫,則需要添加LowerCaseFilterFactory

請注意,您有兩個分析器:「索引」類型和「查詢」類型中的另一個。顧名思義,第一個用於索引內容,而另一個用於查詢時。一個幾乎總是好的規則是爲兩個分析儀都設置相同的標記器/過濾器。

+0

謝謝,這幫了很多! – Daniel 2010-08-23 14:22:16

+0

我建議使用PatternReplaceCharFilterFactory在標記之前刪除單引號字符。 – 2014-07-16 18:29:07

+0

如果查詢分析器除了索引分析器的所有東西之外還有一個額外的同義詞過濾器,可能會更好? – WoLfPwNeR 2015-11-19 20:59:01

0

如果您只是想要完全匹配,請在查詢時使用KeywordTokenizerFactory而不是StandardTokenizerFactory。

+0

謝謝你快速回答。然而,在使用KeywordTokenizerFactory時,我根本沒有得到任何結果,像「foo bar」這樣的查詢。我試着添加來查詢分析器,但仍然沒有改變。我正在用盡想法.. – Daniel 2010-08-23 12:24:34

0

我想你沒有得到任何結果,因爲令牌在已經編入索引的數據上完成的方式不同。 正如帕斯卡爾所說,whitespaceTokenizer是您的案例中的正確選擇。在索引和查詢時使用它,並在索引一些數據之後檢查結果,而不是索引以前的索引數據。

我建議使用分析頁面來查看結果,而不用真正的索引。它非常有用。在模式中進行更改,刷新核心,轉到分析頁面並查看詳細輸出以獲得逐步分析。