2015-08-09 59 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

好的,非常感谢 :) –