您好,登錄后才能下訂單哦!
這篇文章主要講解了“lucene4.7正則查詢怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“lucene4.7正則查詢怎么實現”吧!
lucene內置了許多的查詢API,以及更強大的自定義查詢方式的QueryParse,大部分情況下我們使用內置的查詢API,基本上就可以滿足我們的需求了,但是如果你想更靈活的定制自己的查詢或者改寫自己的查詢API那么你完全可以繼承QueryParse類來完成這項工作。
從某種方式上來說,正則查詢(RegexpQuery)跟通配符查詢(WildcardQuery)的功能很相似,因為他們都可以完成一樣的工作,但是不同的是正則查詢支持更靈活定制細化查詢,這一點與通配符的泛化是不一樣的,而且正則查詢天生支持使用強大的正則表達式的來準確匹配一個或幾個term,需要注意的是,使用正則查詢的字段最好是不分詞的,因為分詞的字段可能會導致邊界問題,從而使查詢失敗,得不到任何結果,這一點和WildcardQuery效果是一樣的。
下面先來看一下,散仙的測試數據,為了看出分詞與不分詞給查詢造成的影響,散仙的用同樣的內容做測試,分詞工具使用的是IK的分詞器,截圖如下:
在上圖中,散仙使用2個字段存儲一樣的內容,一個是分過詞的,一個沒分過詞的,下面給出使用正則查詢的核心代碼:
RegexpQuery query=new RegexpQuery(new Term(field, ".*"+searchStr+".*")); // System.out.println(query.toString()); TopDocs s=search.search(query,null, 100); // TopDocs s=search.search(bool,null, 100); System.out.println(s.totalHits); for(ScoreDoc ss:s.scoreDocs){ Document docs=search.doc(ss.doc); System.out.println("id=>"+docs.get("id")+" name==>"+docs.get("bookName")+" author==>"+docs.get("author")); // System.out.println(docs.get(field)); }
下面我們先來測,對不分詞的字段的做模糊查詢,測試的代碼如下:
dao.testRegQuery("bookName","并發");
結果如下:
命中數據 :2 id=>2 name==>并發數據挑戰面臨巨大的挑戰 author==>并發數據挑戰面臨巨大的挑戰 id=>4 name==>我們的并發數量并秦東亮在不不是很大 author==>我們的并發數量并秦東亮在不不是很大
我們發現它很出色完成了模糊的查詢,并且耗時比通配符查詢同樣的查詢條件的耗時要少,下面我們對分詞的字段,進行檢索,測試代碼如下:
dao.testRegQuery("author","并發");
結果如下:
命中數據 :3 id=>2 name==>并發數據挑戰面臨巨大的挑戰 author==>并發數據挑戰面臨巨大的挑戰 id=>3 name==>the food is perfect! author==>我們的并發數量并不是很大 id=>4 name==>我們的并發數量并秦東亮在不不是很大 author==>我們的并發數量并秦東亮在不不是很大
我們發現對分詞字段的模糊匹配,也同樣沒問題,下面我們來測下對分詞字段的邊界查詢。代碼如下:
dao.testRegQuery("bookName","e q"); dao.testRegQuery("bookName","量并"); System.out.println("===========對比界限============="); dao.testRegQuery("author","e q"); dao.testRegQuery("author","量并");
結果如下:
命中數據 :1 id=>1 name==>the quick brown fox jumps over the lazy dog author==>the quick brown fox jumps over the lazy dog 命中數據 :1 id=>4 name==>我們的并發數量并秦東亮在不不是很大 author==>我們的并發數量并秦東亮在不不是很大 ===========對比界限============= 命中數據 :0 命中數據 :0
由以上結果,我們可以發現分詞后的字段,如果在某個字之間被切分成兩個term,那么無論你用什么樣的方式模糊這兩個term邊界之間的數據,都查詢不到任何結果,而不分詞的字段,卻能查出來,這是因為,不分詞的字段都是作為一個單獨的term來處理的,來lucene的內部匹配方式,恰恰又是以term作為最小檢索單位的,故能檢索到結果,這一點需要我們格外注意,在實現我們的業務時,要根據自己的場景來設計出最優的分詞策略。
下面散仙要測的是正則查詢的老本行了,使用正則表達式進行查詢,代碼如下:
dao.testRegQuery("bookName","[fb]ox");//利用正則式檢索
結果如下:
命中數據 :2 id=>1 name==>the quick brown fox jumps over the lazy dog author==>the quick brown fox jumps over the lazy dog id=>5 name==>log is small box author==>log is small box
感謝各位的閱讀,以上就是“lucene4.7正則查詢怎么實現”的內容了,經過本文的學習后,相信大家對lucene4.7正則查詢怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。