【问题标题】:Search within the results got from elasticsearch在从 elasticsearch 获得的结果中搜索
【发布时间】:2017-09-12 20:45:00
【问题描述】:

是否可以在我从 elasticsearch 获得的结果中进行搜索?

为了实现这一点,目前我需要在 elasticsearch 上运行并等待两次搜索:第一次搜索是

{ "match": { "title": "foo" } }

需要 5 秒并返回 500 个文档等。然后进行第二次搜索

{
  "bool": {
    "must": [
      { "match": { "title": "foo" } },
      { "match": { "title": "bar" } }
    ]
  }
}

又需要5秒,返回200个文档,从elasticsearch的角度来看,这基本上与第一次搜索无关。

我不想这样做,而是向我的用户提供“在结果中进一步搜索”选项。希望通过此选项,用户可以根据第一次搜索返回的结果,使用提供的更多关键字进行搜索。

所以我的场景是用户使用关键字“foo”进行第一次搜索,并在网页上获得 500 个结果,然后选择“在结果中进一步搜索”,在 500 个结果中进行第二次搜索,并且希望能很快得到一些精炼的结果。

我怎样才能实现它?谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用IDS query。从第一个请求中收集所有文档 ID,然后使用新的 Bool 查询发布它们,该查询在原始 query 旁边的 must 子句中包含 IDS 查询。您可以使用 Scroll API 在第一个请求中有效地收集 ID。由于无论如何都会返回排序后的第二个结果,因此在第一个请求中进行任何排序是没有意义的,因此您可以加快第一个请求的速度。

    见:

    【讨论】:

    • 这是一个不错的方法。谢谢!
    • 不客气。这在速度方面表现很好。你能接受我的回答吗?
    【解决方案2】:

    post filter 是一种在其他搜索中搜索的方式。

    在你的情况下:

    GET _search
    {
      "query": {
        "match": {
          "title": "foo"
        }
      },
      "post_filter": {
        "match": {
          "title": "bar"
        }
      }
    }
    

    post_filter 将在查询结果时执行。

    【讨论】:

    • 我认为它不适合我的情况。我的场景是用户第一次用关键字“foo”搜索,在网页上得到500个结果,然后选择“在结果中进一步搜索”,在500个结果中进行第二次搜索,希望得到一些精炼结果真的很快。
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2019-12-01
    • 2010-10-26
    • 2017-06-28
    • 2015-11-11
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多