2016-09-08 36 views
0

有相當多的鏈接詳細說明了StrField和TextField之間的區別。還有一些鏈接解釋說,儘管該字段已編入索引,但它不會被標記並存儲爲單個關鍵字,這可以通過對Solr admin和CURL debugQuery選項進行調試分析來驗證。通配符如何在Solr中使用StrField?

我無法理解的是通配符如何在StrFields上工作?例如,如果名稱是「John Doe」,並且我搜索「John *」,那麼我可以找到該匹配。這意味着,在某個深處的某個地方,可能存在一個Trie或詞典表示形式,允許使用部分字符串進行搜索。

我都會以爲,通配符將匹配的TextField允許(邊)NGramFilters等

回答

1

我覺得你有它周圍的錯誤的方式 - 使用文本字段與NGramFilter將使用允許匹配沒有通配符,因爲它們會產生大量的令牌:

foo => f, o, o, fo, oo, foo 

搜索只是fo然後將匹配現有的令牌(或者如果你在查詢擴展的n-gram爲好,比賽fofo)。

在一個通配符搜索(這可能不是今天的實際實現,但它解釋了它將如何工作),Lucene可以查看列表中的所有標記,從所提供的前綴開始(因爲這是一個排序列表),然後迭代可用的值,直到找到一個不共享相同前綴的值。對字母數字值的範圍查詢需要相同的功能。

這也是爲什麼反向通配符卡片過濾​​器很有意義 - 它爲每個值添加了反轉標記,從而允許您將*foo轉換爲搜索oof*

正如任何通配符搜索消除分析階段(這是真的很難做出一個通配符字符串分析的意義,它可能不會做你希望它做什麼),最終的結果是「只「獲取與前綴匹配的令牌範圍。