当前位置: 首页 > 知识库问答 >
问题:

弹性搜索-无法创建查询

蒋俊
2023-03-14

我在使用Python弹性搜索访问inner_hits数据时遇到了一个问题。我正在得到

RequestError(400,'search\u phase\u execution\u exception','failed to create query'

尝试使用内部\u hits{}时出错
我的弹性搜索版本6.5。4,python版本3.7。2.

from elasticsearch import Elasticsearch
es = Elasticsearch()


mapping = '''{
        "mappings": {
    "tablets": {
      "properties": {
        "Names": {
          "type": "nested"
          "properties":{
              "ID": {"type" : "long"},
              "Combination": {"type" : "text"},
              "Synonyms": {"type" : "text"}
          }
        }
      }
    }
  }
}'''

es.indices.create(index="2", ignore=400, body=mapping)

tablets = {
    "Names":[
    {
    "ID" : 1,    
    "Combination": "Paracetamol",
    "Synonyms": "Crocin"
    },{
    "ID" : 2,
    "Combination": "Pantaprazole",
    "Synonyms": "Pantap"
    }]}

res = es.index(index="2", doc_type='json', id=1, body=tablets)

z = "patient took Pantaprazole."



res= es.search(index='2',body=
{
  "query": {
    "nested": {
      "path": "Names",
      "query": {
        "match": {"Names.Combination" : z}
      },
      "inner_hits": {} 
    }
  }
})
print(res)

Output---------------------------------------------------

    "inner_hits": {}
      File "C:\Users\aravind\AppData\Local\Programs\Python\Python37-32\lib\site-packages\elasticsearch\client\utils.py", line 76, in _wrapped
        return func(*args, params=params, **kwargs)
      File "C:\Users\aravind\AppData\Local\Programs\Python\Python37-32\lib\site-packages\elasticsearch\client\__init__.py", line 660, in search
        doc_type, '_search'), params=params, body=body)
      File "C:\Users\aravind\AppData\Local\Programs\Python\Python37-32\lib\site-packages\elasticsearch\transport.py", line 318, in perform_request
        status, headers_response, data = connection.perform_request(method, url, params, body, headers=headers, ignore=ignore, timeout=timeout)
      File "C:\Users\aravind\AppData\Local\Programs\Python\Python37-32\lib\site-packages\elasticsearch\connection\http_urllib3.py", line 186, in perform_request
        self._raise_error(response.status, raw_data)
      File "C:\Users\aravind\AppData\Local\Programs\Python\Python37-32\lib\site-packages\elasticsearch\connection\base.py", line 125, in _raise_error
        raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
    elasticsearch.exceptions.RequestError: RequestError(400, 'search_phase_execution_exception', 'failed to create query: {\n  "nested" : {\n    "query" : {\n
     "match" : {\n        "Names.Combination" : {\n          "query" : "patient took Pantaprazole.",\n          "operator" : "OR",\n          "prefix_length" : 0,\n          "max_expansions" : 50,\n          "fuzzy_transpositions" : true,\n          "lenient" : false,\n          "zero_terms_query" : "NONE",\n          "auto_generate_synonyms_phrase_query" : true,\n          "boost" : 1.0\n        }\n      }\n    },\n    "path" : "Names",\n    "ignore_unmapped" : false,\n    "score_mode" : "avg",\n    "boost" : 1.0,\n    "inner_hits" : {\n      "ignore_unmapped" : false,\n      "from" : 0,\n      "size" : 3,\n      "version" : false,\n      "explain" : false,\n      "track_scores" : false\n    }\n  }\n}')

共有1个答案

宗政子辰
2023-03-14

感谢您在运行代码的同时发布代码,并以可以复制粘贴和运行的方式发布代码。这真的很有帮助。

映射的JSON中缺少逗号,但错误被忽略,因为您设置了ignore=“400”

下面是修复脚本的外观:

import time

from elasticsearch import Elasticsearch
es = Elasticsearch()

# fix typo - missing comma after "nested"
mapping = '''{
"mappings": {
    "tablets": {
      "properties": {
        "Names": {
          "type": "nested",
          "properties":{
              "ID": {"type" : "long"},
              "Combination": {"type" : "text"},
              "Synonyms": {"type" : "text"}
          }
        }
      }
    }
  }
}'''

# remove ignore="400"
es.indices.create(index="2", body=mapping)

tablets = {
    "Names": [
        {
            "ID": 1,
            "Combination": "Paracetamol",
            "Synonyms": "Crocin"
        }, {
            "ID": 2,
            "Combination": "Pantaprazole",
            "Synonyms": "Pantap"
        }
    ]
}

我们还需要将doc\u type设置为映射中声明的类型:

# set doc_type to 'tablets' since this is what we defined in mapping
res = es.index(index="2", doc_type='tablets', id=1, body=tablets)

z = "patient took Pantaprazole."

# allow Elasticsearch to refresh data so it is searchable
time.sleep(2)

res= es.search(index='2',body=
{
  "query": {
    "nested": {
      "path": "Names",
      "query": {
        "match": {"Names.Combination" : z}
      },
      "inner_hits": {}
    }
  }
})
print(res)

就这样了!脚本的输出将看起来像:

{'take':7,'timed_out':False,'u shards':{'total':5,'successful':5,'skipped':0,'failed':0},“点击次数:{'total':1,'max_score':0.6931472,'hits':[{'u index':'2','u type':'tables','u id':'1','u score':0.6931472,'u source':{'Names':[{'id':1,'composition':'Paracetamol','s':'s':'Crocin'},{'id':2,'composition':'Pantaprazole','Synonyms':'Pantap',',“内部点击数”:{Names':{'hits':{'total':1,“最大点击数”:0.6931472,'hits':[{'u index':'2','u type':'tables','u id':'1','u嵌套':{'field':'Names','offset':1},'u score':0.6931472','u source':{'id':2','composition':'Pantaprazole','Synonyms':'Pantap'}}}}

Elasticsearch在创建查询时引发了一个错误失败,因为它无法针对非嵌套的字段创建嵌套查询。

字段应该是嵌套的,为什么不是呢?

映射中有一个输入错误,缺少一个逗号。Elasticsearch无法放置映射。为什么脚本没有失败?

因为在Python调用es时。指数create()设置了ignore=“400”参数,这使得Python Elasticsearch客户端忽略HTTP 400响应代码,而HTTP 400响应代码又对应于“格式错误的数据错误”。

那么,为什么Elasticsearch允许您进行其他查询,如文档索引和搜索?

因为默认情况下,Elasticsearch将不需要映射,并将从文档的结构中推断它。这被称为动态映射。

 类似资料:
  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我正在使用推荐的 RestHightCLient 和 ElasticsearchRestTemplate。我正在尝试从弹性搜索中检索ZonedDateTime,但似乎spring-data-elasticsearch无法创建ZonedDateTime类的对象。下面的代码片段有任何问题,我需要添加哪些其他配置。 此外,如果我要直接使用ResHighLevel客户端,而不使用Elasticsearch

  • 我试图使用docker容器创建一个弹性搜索安装。我只使用Elastic.io提供者的映像。 我不知道为什么,但logstash告诉我,他无法连接到带有此错误消息的ElasticSearch实例: 如果logstash真的得到了我的设置,有人能告诉我为什么他使用了一个坏的主机事件吗?

  • 我在术语查询中要求弹性搜索中的嵌套字段,其中嵌套字段值应与术语查询中提供的值的数量完全匹配。例如,考虑下面的查询,在这里我们对名为类型的嵌套字段进行查询。 GET资产/_search 索引映射 样本文件: 上述查询应返回字段类型正好有2个值的文档,即“VOD”

  • 我是弹性搜索的新手,我正在尝试使用下面的映射创建索引,我在网上找到了这些映射,并使用kibana作为我的客户机,它抛出错误。 “类型”:“映射程序解析异常”,“原因”:“根映射定义有不受支持的参数:[local_test:{u all={enabled=false},properties={amount={type=long},user_id={type=keyword},recurtive={t