2010-07-29 90 views
2

Lucene NOOB警報!Lucene中的查詢類型

我認爲自己是一個至少具有合理智能的人,然而我在心理上對Lucene中的查詢類型進行精神問題。

在我的特殊情況下,我需要搜索我的文檔中只有一個單一的字符串字段長度(平均約50個字符)。

我希望用戶能夠在他們正在搜索的項目內鍵入單詞的開頭。而且我也不想強制他們提供條款的順序。

實例字段:「一般的品牌實力」

應符合搜索: 「通用品牌實力」 「品牌普力」 ...... 「創麩STR」 「糠通用海峽」 。 .. 等

我可能在單獨的字段中存儲我的信息(每個單詞在這個例子中)如果有幫助,但我不相信它會。

我目前迷失在模糊通配符和多項短語的世界。

任何人都可以爲我澄清這整個場景嗎? (是的,我已經廣泛地在網上尋找幫助,但找不到像樣的資源)。

順便說一句我正在使用Lucene 2.9,但我不認爲這真的很重要。

回答

4

你不必存儲在不同的領域內每學期。 Lucene會在每個術語之外創建令牌(如果您使用的是空白標記器),因此可以提供極大的搜索靈活性。

要將有關的問題:

實例字段: 「一般的品牌 實力」

應該匹配的搜索: 「通用品牌 實力」, 「品牌普力」

的上述查詢將返回兩個結果,後者由於顯而易見的原因而得分較低。然而,「gen bran str」,「bran generic str」......等是棘手的,因爲它看起來這些術語不是標準的「梗」,在這種情況下你可以使用stemmer分析器。

最簡單的方法是:

  1. 由空格分割的查詢短語,讓你有一個字符串[]
  2. 使用Booleanquery併爲每個術語附加在通配符查詢結束。

喜歡的東西:

string[] terms = query.split(" "); 
BooleanQuery bq = new BooleanQuery(); 

foreach(string term in terms) 
bq.Add(new Query("FieldName", term + "*",...); 

有更好的查詢類型,如SpanQuery,DisMax等。,但是由於您提到了noob提醒,所以認爲上述內容最簡單(儘管不是最優雅的)方法。

HTH

+0

+1爲通配符解決方案。最簡單,儘管它可能會對大型索引產生性能問題。 – bajafresh4life 2010-07-29 16:28:22

+0

使用wilcard查詢(通過添加星號)和PrefixQuery之間是否存在顯着差異?他們看起來和我一樣。思考?他們基本上歸結爲同一件事情嗎? – berko 2010-07-30 03:37:53

+0

是的,它們是相同的。 Javadocs這樣描述它: 「查詢匹配包含具有指定前綴的術語的文檔.PrefixQuery由QueryParser構建,用於像app *一樣的輸入。」 – Mikos 2010-07-30 11:20:22