2010-01-18 67 views
0

我目前正在開發一個AppEngine項目,並且我想實現搜索術語的自動完成。 項目可以搜索的是合理的明確和簡短,所以我想通過給每個項目列表的不完整類型來實現它。所以foobar會得到像[f, fo, foo, foob, fooba, foobar]這樣的列表。然後將搜索框中的用戶文本與該列表進行比較,並建議使用正匹配。如何格式化搜索自動完成零件列表?

有一對夫婦在此列表中可能的優化,我在想:

  • 從搜索詞去掉空格標點符號。 Foo. BarFooBar
  • 刪除大寫字母
  • 刪除「the」,「a」,「an」等前導粒子。 The Guy將是guy,並索引爲[g, gu, guy]
  • 只能將長度大於2或3的子字符串添加到索引列表中。因此The Guy將被索引爲[gu, guy]。我認爲只有與第一封信相匹配的建議纔不那麼重要。

用戶搜索詞也將以這種方式格式化,之後搜索數據庫。在建議搜索詞時,根據建議對象的全名添加粒子,標點符號和大寫字母。所以尋找「the」不會有任何建議,但尋找「The Gu ..」或「gu」會提示「The Guy」。

這是個好主意嗎?主要是:這種格式的幫助,還是隻會造成麻煩?

回答

2

我已經遇到同樣的問題,我採用的解決方案與您的想法非常相似。我將這些項目拆分爲單詞,將它們轉換爲小寫,刪除重音符號,並創建一個開始列表。例如,"Báz Bar"將變成['b', 'ba', 'bar', 'baz']

我已在此thread中發佈代碼。搜索框of this site正在使用它。隨意使用它,如果你喜歡。

+0

將空格上的單詞分開有用嗎?當用戶在搜索框中輸入_both_字時,如何匹配字符串?你需要爲每個單詞做一個單獨的數據庫查詢嗎?像'開始時的詞1 +開始時的詞2 +詞3等'# – noio 2010-01-19 22:23:45

+1

不,實際上,您可以爲每個單詞級聯一個過濾器:'query.filter('start'='word1')。filter('start =' ,'word2')....' – jbochi 2010-01-19 23:19:12