2009-04-29 22 views
4

我正在使用Zend Lucene爲php網站構建搜索功能,並且出現問題。 我的網站是一個店主(類似的東西)。如何在Zend Lucene中搜索「Foo Bar」時發現「FooBar」

例如,我有一家名爲「FooBar」的商店,但我的訪客在搜索「Foo Bar」並獲得零結果。此外,如果一家商店被命名爲「Foo Bar」,並且訪問者搜索「FooBar」,則什麼也找不到。

我試圖SEACH找到「foobar〜」(模糊SEACH),但沒有找到名爲「富酒吧」

有沒有建立索引或者使查詢speciar方法的文章?

回答

2

選項1:將輸入查詢字符串分爲兩部分,並在各個點處進行搜索。例如。在這種情況下,查詢將是(+ fo + bar)OR(+ foo + bar)OR(+ foob + ar)問題是這種標記化假定輸入查詢字符串中有兩個標記。另外,您可能會得到額外的,可能不相關的結果,如(+ foob + ar)的結果

選項2:在索引和查詢時使用n-gram標記化。索引「foo bar」的標記將是fo,oo,ba,ar。當用foobar搜索時,令牌將是fo,oo,ob,ba,ar。用OR作爲運算符搜索會給你最高n-gram匹配的文件。這可以用NGramTokenizer

+0

Op。 2聽起來不錯,有什麼想法如何使用n-gram標記化?謝謝 – Daniel 2009-04-29 10:24:13

0

您是否嘗試過「* foo *和* bar *」或「* foo *或* bar *」?它在Ferret工作,我讀它是基於Lucene。

+0

它的工作原理如果queri是FOO BAR,並且在數據庫中我有FOOBAR但是如果您正在爲FOOBAR尋找數據並且在數據庫中有FOO BAR,那麼它不起作用 – Daniel 2009-04-29 07:58:29

+0

對,我的錯誤...我瘋了想法:嘗試在每個字符「f * o * o * b * a * r」之間加上'*',並設置一些字符串長度限制(如果str_len> 5)。或者你可以嘗試在上下字母之間加上空格 - 然後你將「FooBar」分隔爲「Foo Bar」 - 但用戶需要把這個字符串放在駱駝的情況下。 – klew 2009-04-29 09:29:28

0

實現如果你不關心性能,使用WildcardQuery(性能顯著惡化):

new WildcardQuery(new Term("propertyName", "Foo?Bar")); 

零個或多個字符,請使用「*」,零個或一個字符, 使用 '?'

如果性能很重要,請嘗試使用BooleanQuery。

1

手動添加大多數常見名稱混淆的索引條目。讓您的客戶以特殊形式輸入。

相關問題