2012-09-03 79 views
1

幾個月前我問了一個類似的問題here。但我無法正常工作:NGram按順序搜索

我嘗試建立一個簡單的文件名搜索。我希望用戶可以搜索 的文件名的任何部分。
比方說,以下文件名進行索引:

[1] My_file_2012.01.12.txt 
[2] My_file_2012.01.05.txt 
[3] My_file_2012.05.01.txt 
[4] My_file_2012.08.27.txt 
[5] My_file_2012.12.12.txt 
[6] My_file_2011.12.12.txt 
[7] file_01_2012.09.09.txt 

然後,用戶可以搜索:

"ile_20"     (finds the first six documents) 
"12.txt"     (finds 1, 5, 6) 
"12" followed by "01"  (finds 1, 2, 3 - NOT 7) 
"2012" followed by "01"  (finds 1, 2, 3 - NOT 7) 

(注:是的,用戶可能真的搜索諸如「ile_20」串...例如 ,因爲複製和粘貼錯誤)

因此,我使用nGram-tokenizer來索引文件名的每個部分。這 到目前爲止工作正常。 爲了支持上文提到的「後面」 - 搜索,我需要一個查詢,該查詢的 尊重術語的順序,無論這兩個術語之間有多少文字(好吧,我們假設最多100個字符)。

由於使用「slop」的「text_phrase」查詢並不尊重 這些術語的順序,所以我決定使用「span_near」查詢。這在大多數情況下工作正常 。

在這裏看到我的完整示例索引。錯誤描述:click

如在查詢「‘2012’接着‘01’」,因爲NGRAM標記生成器不 不起作用上面的例子中提到的生成每個 令牌的位置值,但這些值不當被「span_near」查詢使用時非常有用。雖然 建立索引,但術語「2012」被分配給大於術語「01」的位置值(例如10)的位置值(50) 。由於50和10 不是爲了查詢將沒有結果。訂單物品 僅對具有相同長度的條款(例如,「12」後跟 '01'「)或條款按長度排序(例如,」20「後跟 )進行了更正。 12' 「)。

那麼我該如何實現正確的搜索行爲呢?我只希望能力 在尊重 條款的順序的同時搜索文件名的任何部分。
也許有辦法告訴「span_near」不使用該位置,而是使用 代替「start_offset」? 還是有另一個查詢,我可以使用?

回答

0

怎麼樣這樣的通配符搜索:

「12」,其次是 「01」 - > 12 * 01

+0

是的,這是因爲昨天我做什麼。它的工作原理是因爲由於NGram-tokenizer每個可能的搜索項被索引。不過,我不知道這是否會導致性能問題。我已經通過使用edgeNGram來大幅加快搜索速度。 – Biggie

+0

有一種有限的方式可以做到這一點:例如,你只能在日期上做到這一點。用簡單的英語,它將是「mysubstring以A開始並以B結尾」。我用solr來說話,所以請適當翻譯。 1.複製到一個新的字段,我們稱之爲FieldFront 2.使用正則表達式,並只保留您感興趣的部分(例如:[0-9 \。] +會在連續數字或點子串上匹配) 3.在左側應用邊緣n-gram 用新副本域FieldRev重複1-3。除了第3步,你會從右邊做。 然後當你運行你的查詢時,你可以說類似於A:12和B:01 –