回答
Lucene提供了ReverseStringFilter,允許像*用戶那樣進行通配符搜索。它通過以相反順序索引所有術語來工作。
但我認爲沒有辦法做類似'LIKE%user%'的事情。
有趣。實際上,這意味着您需要提前設置您的索引以允許引用通配符。從查看bug(https://issues.apache.org/jira/browse/LUCENE-1398),似乎只能指定一個通配符,但不能在同一個術語中使用尾隨符號(因爲那樣你重新回到同樣的問題)。 – Jon 2010-07-22 12:00:16
當你考慮這個問題時,lucene對通配符的支持通常被限制在一個單詞模式結尾的通配符並不令人驚訝。
關鍵字搜索引擎通過創建語料庫中所有單詞的反向索引來工作,該單詞按語序排序。當您執行正常的非通配符搜索時,引擎會利用這樣的事實,即索引條目經過排序以在O(logN)
步驟中找到您的單詞的條目或條目,其中N
是單詞或條目的數目。對於帶有後綴通配符的單詞模式,發現第一個匹配單詞時會發生同樣的情況,通過掃描條目直到模式的固定部分不再匹配,可以找到其他匹配。
然而,對於一個通配符前綴和通配符後綴的單詞模式,發動機要看看索引中的所有條目。這將是O(N)
...除非引擎構建了一堆用於匹配單詞的文字子串的二級索引。 (這樣會使索引變得更加昂貴)。而對於更復雜的模式(例如正則表達式),這個問題對於搜索引擎會更糟糕。
LIKE查詢的麻煩在於它們在執行時間方面是expensive。您可以設置的QueryParser,讓領先的通配符如下:
QueryParser.setAllowLeadingWildcard(true)
,這將允許你這樣做的搜索,如:
*user*
但是,這將需要很長的時間來執行。有時當人們說他們想要LIKE查詢時,他們實際需要的是fuzzyquery。這將允許你做以下搜索:
user~
這將符合條件users
和fuser
。您可以使用介於0和1之間的浮點值指定查詢中術語與要匹配的術語之間的編輯距離。例如user~0.8
可能會匹配比user~0.5
更多的術語。
我建議你也看看regex query,它支持Lucene搜索的正則表達式語法。它可能更接近你真正需要的東西。也許是這樣的:
.*user.*
- 1. PostgreSQL查詢,LIKE運算符
- 2. 如何使用Like運算符來查詢參數化查詢
- 3. 使用like運算符執行查詢
- 4. 如何跳過多個LIKE查詢中的空LIKE運算符?
- 5. Lucene查詢和AND邏輯運算符
- 6. HQL與like和or運算符查詢
- 7. SQL搜索查詢與like運算符
- 8. 如何使用Flask-Restless支持的查詢運算符「like」
- 9. ,Postgres的查詢不使用like運算
- 10. NOT運算符在查詢lucene中不起作用
- 11. 使用LIKE運算符的Linq查詢無法正常工作
- 12. Hibernate命名查詢使用Like和%%運算符?
- 13. SQL Like運算符
- 14. 與Like運算符
- 15. 使用-Like運算符
- 16. 「LIKE」查詢算法
- 17. LIKE運算符的查詢字符串生成器
- 18. FusionTable API查詢LIKE運算符和通配符
- 19. 如何使用Sql Server中的like運算符來查詢參數化
- 20. 如何在java的Apache Solr的select查詢中使用like運算符?
- 21. 如何在Hibernate HQL中使用LIKE運算符的參數化查詢?
- 22. 如何使用LIKE運算符從交換服務器查詢聯繫人?
- 23. 如何在neo4j Cypher查詢中使用like運算符傳遞動態參數
- 24. 如何在sqlite中使用like運算符進行復雜查詢
- 25. Like運算符檢查多個單詞
- 26. sql,子查詢到一個LIKE()運算符
- 27. SQL查詢中'LIKE'運算符的速度很慢,pdo_sqlite
- 28. 如何編寫將作爲LIKE運算符工作的LINQ IN子句查詢?
- 29. Postgresql中的LIKE運算符
- 30. SQL Charindex與LIKE運算符
有點類似的問題:[http://stackoverflow.com/questions/468279/lucene-net-leading-wildcard-character-throws-an-error](http:// stackoverflow.com/questions/468279/lucene-net-leading-wildcard-character-throws-an-error) – devson 2010-07-22 10:43:14