在elasticsearch中合并术语和布尔查询

7ajki6be  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(2)|浏览(348)

我想在elasticsearch索引中进行搜索,但只搜索ID列表。我可以用一个术语查询选择ID

{
    "query": {
        "terms": {
            "_id": list_of_ids
        }
    }
}

现在我想在结果列表中搜索,这可以通过这样的查询完成

{
    "query": {
        "bool": {
            "must": {}
        }
    }
}

我的问题是如何将这两个查询结合起来?我发现的一个解决方案是像这样将id添加到must查询中

{
    "query": {
        "bool": {
            "must": {}
            "should": [{
                "term": {
                    "_id": id1
                },
                "term": {
                    "_id": id2
                }]
            }
        }
    }
}

效果很好。但是,如果ID列表非常大,则可能会导致错误。

elasticsearch.exceptions.RequestError: RequestError(400, 'search_phase_execution_exception', 'failed to create query:

我想知道是否有更简洁的方法来编写这样的查询?我想上面的错误是因为我的查询太长了,因为我添加了数千个搜索词。。。一定有办法只提供一个数组,比如在terms查询中?

shyt4zoc

shyt4zoc1#

解决了

{
    "query": {
        "bool": {
            "must": {},
            "filter": {
                "terms": {
                    "_id": list_of_ids
                }
            }
        }
    }
}

抱歉,我对elasticsearch是个新手。。。

piwo6bdm

piwo6bdm2#

您还可以使用ids query,它根据文档的id返回文档。
添加索引数据、搜索查询和搜索结果的工作示例。
索引数据:

{
    "name":"buiscuit",
    "cost":"55",
    "discount":"20"
}
{
    "name":"multi grain bread",
    "cost":"55",
    "discount":"20"
}

搜索查询:

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "bread"
        }
      },
      "filter": {
        "ids": {
          "values": [
            "1",
            "2",
            "4"
          ]
        }
      }
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "65431114",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5754429,
        "_source": {
          "name": "multi grain bread",
          "cost": "55",
          "discount": "20"
        }
      }
    ]

相关问题