使用数组作为搜索输入的Elasticsearch查询

问题描述 投票:0回答:1

我正在尝试使用字符串数组作为搜索输入来查询某些索引数据。

索引数据如下所示:

{
  "pubMedID": "21528671",
  "title": "Basic fibroblast [...] melanoma cells.",
  "abstract": "Human malignant [...] cell growth."
}

我想在'title'和'abstract'字段中搜索多个字符串。例如:

queryString=['melanoma', 'dysplastic nevus syndrome']

我已经尝试过以下代码:

queryString=['melanoma', 'dysplastic nevus syndrome']

payload={
  "query": {
    "bool": {
      "should": [
        {
          "query_string": {
            "query": queryString,
            "fields": [
              "title",
              "abstract"
            ]
          }
        }
      ]
    }
  }
}


payload_json = (json.dumps(payload))
res = esclient.search(index='medicine',body=payload_json)

但是在运行时遇到以下错误:

RequestError: RequestError(400, 'parsing_exception', '[query_string] query does not support [query]')

如果我只是输入一个简单的字符串值,查询就可以正常工作。有人能告诉我如何将这种查询作为输入数组提供吗?先感谢您!

python elasticsearch
1个回答
1
投票

编辑:

我对query_string查询有点不熟悉,但事实证明你也可以用它来做这样的事情:

qs = ''
for q in queryStrings:
  if qs:
    qs += ' OR '
  qs += q

payload={
  "query": {
    "bool": {
      "should": [
        {
          "query_string": {
            "query": qs,
            "fields": [
              "title",
              "abstract"
            ]
          }
        }
      ]
    }
  }
}

结果将是类似于下面概述的多个子句的查询。

docs:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

原版的:

这可以通过以下多个子句来实现:

queryString=['melanoma', 'dysplastic nevus syndrome']

payload={
  "query": {
    "bool": {
      "should": [
        {
          "query_string": {
            "query": queryString[0],
            "fields": [
              "title",
              "abstract"
            ]
          }
        },
        {
          "query_string": {
            "query": queryString[1],
            "fields": [
              "title",
              "abstract"
            ]
          }
        }
      ]
    }
  }
}

如果您有不同数量的查询,那么您只需要动态构建“should”子句,如:

shoulds = []
for q in queryStrings:
   shoulds.append({
      "query_string": {
        "query": q,
        "fields": [
          "title",
          "abstract"
        ]
      }
    })

payload={
  "query": {
    "bool": {
      "should": shoulds
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.