【问题标题】:How to search millions of documents with an average of 8000 words each?如何搜索数以百万计的文档,每个文档平均有 8000 个单词?
【发布时间】:2013-09-30 02:54:50
【问题描述】:

我有一个奇怪的问题,我需要一些帮助。

我有一个包含 600 万个文档的数据集,每个文档由近 8000 个单词组成。每个单词总是一个数字,单词/数字之间用空格隔开。

索引所有数据后(我现在只索引一个子集)我需要按数字列表执行查询,但我只想要具有 all 这些数字的文档(条件是 AND )。

我想出了这个:

String [] codes_vec = ARRAY_WITH_500_STRINGS_ALL_NUMBERS;

BoolQueryBuilder qBuilder = QueryBuilders.boolQuery();

for (int i =0; i < codes_vec.length; ++i)
{

   qBuilder = qBuilder.must(QueryBuilders.matchQuery("code", codes_vec[i]));

}

问题是,这似乎效率很低,我怎样才能加快搜索速度?有没有更好的查询 ElasticSearch 的方法在我的情况下会更快?

亲切的问候, 泽玛丽亚

【问题讨论】:

  • 你知道这500个字符串是什么吗?当它们在那里创建时,你能在索引中标记它们吗?
  • 您的索引是如何组织的?
  • 那么索引真的很简单,基本上就是一个文档id + 字符串列表。

标签: java search lucene full-text-search elasticsearch


【解决方案1】:

使用过滤器可能比匹配查询更快。这是关于布尔过滤器的文档:http://www.elasticsearch.org/guide/reference/query-dsl/bool-filter/

以下是创建和使用的方法:

// create the filter
// to cache the results, add .cache(true);
BoolFilterBuilder filterBuilder = FilterBuilders.boolFilter();

// did you mean to skip the first one?
for (int i = 0; i < codes_vec.length; ++i)
    filterBuilder.must(FilterBuilders.termFilter("code", codes_vec[i]));

// add the filter to your search
SearchResponse response = client.prepareSearch("index1")
            .setFilter(filterBuilder)
            .setFrom(0).setSize(10)
            .execute()
            .actionGet();

【讨论】:

  • 我一定会试试的!关于setSize的一个疑问,是不是类似于SQL的LIMIT参数?
  • 是的,size是结果的最大数量;使用 from 指定起点(因此 10 个结果的第二页将是 from=10,size=10)。见elasticsearch.org/guide/reference/api/search/from-size
  • 谢谢!我会试试的
  • 优秀的结果!!快得多:) 谢谢
【解决方案2】:

在线程中拆分处理。我建议使用Future

【讨论】:

  • 感谢您的帮助,但您的意思是我应该在它自己的线程中执行 N 个查询并手动过滤结果?提前致谢
  • 您可以创建和有效使用多少线程取决于您的硬件。如果我理解正确,您有 500 个查询......但我怀疑 500 个线程会对您有所帮助:) 也许从 10 个线程开始,然后给每个线程 50 个查询。最后使用Futureget() 方法将它们全部收集起来。如果你创建了 10 个线程而有 5 个什么都不做,那么减少创建的线程数。
  • 嗯,这并不是真正的 500 个查询,我确实有一个包含 Y 个单词的查询,它应该返回包含所有这些 Y 个单词的所有文档。
  • 在您的 for 循环中,您正在检查包含所有 500 个单词的文档,但您一次只检查一个单词。我的建议是你把它分成线程。每个线程一次仍然只检查一个单词,但您可以让 10 个线程同时检查一个单词。一旦所有线程完成,您将需要如何组合结果,丢弃所有与每个线程中的每个单词都不匹配的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2021-05-30
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多