我正在尝试使用字符串数组作为搜索输入来查询某些索引数据。
索引数据如下所示:
{
"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]')
如果我只是输入一个简单的字符串值,查询就可以正常工作。有人能告诉我如何将这种查询作为输入数组提供吗?先感谢您!
编辑:
我对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
}
}
}