2015-08-09 50 views
-2

我在java中有一組對象(大約10M +),我想要的是一個數據結構,我可以在這些對象的TITLE上進行全文搜索,並以首選的方式對結果進行排序。文本搜索的最佳算法

我想要的是性能,不用擔心內存容量。

我現在要做的是,有一個這些對象的ArrayLists的HashMap。無論何時插入新對象標題都是通過它的單詞吐出來的,並且該對象將被添加到對應的ArrayList中以獲取映射中的所有單詞。

當需要搜索時,搜索短語按詞語拆分並訪問所有ArrayList,並將ArrayList合併並刪除重複項並進行排序。

但是對於1M個對象大約需要1秒。有沒有辦法提高搜索的性能?

+0

你是對的,它聽起來像你應該能夠優化它。具體取決於你如何實現它。我首先看看你的CPU和內存配置文件。順便說一句你使用多個線程? –

回答

0

我推薦使用LuceneElasticsearch。他們非常適合這種用例,高度優化,併爲您提供很多其他可能需要的功能(如模糊匹配,索引管理,分片等等)。

如果您決定推出自己的產品,那麼您所描述的數據結構幾乎爲Google's HashMultimap。爲了優化這一點,我認爲你需要看看時間花在哪裏。查詢HashMap應該是O(1),所以它很可能是合併和排序,這會減慢速度。 - 排序可能很慢,取決於您使用的Comparator

請記住,究竟要調整什麼取決於您的查詢的統計屬性 - 如果它們通常只返回一個或兩個結果,那麼使排序高效是浪費時間。

+0

你好,感謝您的快速回答。我已經使用了Lucene,問題是使用l​​ucene的問題是它沒有提供「%LIKE%」功能,是嗎?我已經通過文檔搜索,但找不到一個 –

+0

當然! https://lucene.apache.org/core/2_9_4/queryparsersyntax.html#Wildcard%20Searches ElasticSearch:https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-matching.html – hugh

+0

好的,非常感謝 :) –