2010-04-07 128 views
3

我想提供部分匹配,所以我正在將*添加到搜索查詢的末尾。我注意到的是,gatorade的搜索查詢將返回12個結果,而gatorade *返回7.因此*似乎是1或多個,而不是0或多個......我怎麼能實現這一點?我是否會在Solr中進行部分匹配?謝謝。Solr查詢結果使用*

+0

你有沒有找到一個解決辦法? (對於websearchers查找此頁面,請參閱此SO問題,並附加提示:http://stackoverflow.com/questions/1974394/apache-solr-search-part-of-the-word/1976045#1976045) – 2013-12-01 13:44:18

回答

7

首先,我認爲Solr通配符比「1或多個」更好地歸納爲「0或多個」。我懷疑這是你問題的根源。 (例如,請參閱the javadocs for WildcardQuery。)

其次,您是否使用了詞幹,因爲我的第一個猜測是您正在處理詞幹問題。 Solr通配符在詞幹方面可能表現得很奇怪。這是因爲通配符擴展是通過搜索存儲在倒排索引中的術語列表來進行的;這些術語將以詞幹形式出現(可能類似「gatorad」),而不是來自原始源文本(可能是「gatorade」或「gatorades」)的單詞。

例如,假設您有一個stemmer將「gatorade」和「gatorades」映射到stem「gatorad」。這意味着你的倒排索引不會包含「佳得樂」或「佳得樂」,只有「佳得樂」。然後,如果您發出查詢gatorade *,Solr將逐步使用索引這個術語來查找以「gatorade」開頭的所有詞幹。但是沒有這樣的詞根,所以你不會得到任何匹配。同樣,如果您搜索gatorades *,Solr將查找以「gatorades」開頭的所有詞幹。但是沒有這樣的詞根,所以你不會得到任何匹配。

三,以獲得最佳的幫助,我會建議張貼一些更多的信息,特別是:

  • 要提交到Solr
  • 摘錄從您的Schema.xml文件的一些特定的查詢網址。特別是,包括A)你有問題的領域的字段元素,和B)與這些字段對應的字段類型定義
+2

+1 need來自OP的更多信息正確診斷這一點。 – 2010-04-07 21:30:48

2

所以我在找的是爲'gatorade ' - >'gatorade或gatorade *'這將給我所有我想要找的比賽。

+0

我懷疑這種方法不足以在所有情況下給出預期的結果。請參閱我的修改後的答案,瞭解一些原因。 (這取決於你的詞幹的細節,但如果你使用我的假設詞幹,你修改後的查詢確實會找到所有含有「佳得樂」的文檔,但它會錯過A]包含「gatorades」但B ]不包含「佳得樂」。) – Chris 2010-04-08 00:26:35

2

如果您想要查詢返回所有匹配詞幹形式的gatorade或以gatorade開頭的單詞的文檔,則需要自行構建查詢:+(gatorade gatorade *)。你也可以擴展SolrParser來做到這一點,但這是更多的工作。

1

另一種選擇是使用NGrams和TokenFilterFactories, specifically the EdgeNGramFilterFactory。 。

這將創建ngram或單詞部分的索引。文檔的最小數量爲5,最大數量爲8,可以索引:Docum Docume文檔文檔

索引大小和時間有一點折衷。其中一本Solr書籍引用爲粗略指南:索引需要10倍以上使用5倍以上的磁盤空間創建6倍以上不同的條款。

但是,EdgeNGram會做得比這更好。

您確實需要確保在查詢中不提交通配符。由於您沒有進行通配符搜索,因此您正在匹配ngrams(詞的部分)上的搜索詞。

1

我的猜測是缺少的匹配是「Gatorade」(大寫'G'),並且您的字段上有一個小寫的過濾器。這個想法是,您的schema.xml中有過濾器來預處理輸入數據,但通配符查詢不使用它們; 請參閱Solr如何處理通配符查詢:

http://solr.pl/en/2010/12/20/wildcard-queries-and-how-solr-handles-them/ (「Solr和通配符處理」)。

0

從我讀過的通配符中,只有搜索詞後面帶有其他字符的匹配詞。 「佳得樂*」將匹配佳得樂而不是佳得樂本身。似乎在版本3.6中對Solr進行了更新,通過使用'multiterm'字段類型而不是'text'字段來考慮此問題。

一個更好的描述是在這裏:

http://bensch.be/the-solr-wildcard-problem-and-multiterm-solution