我正在尝试使用自定义查询DSL来使用pyes库获取结果。我有查询DSL,当我使用命令行
时curl -XGET localhost:9200/test_index/_search -d '{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"field_value_factor": {
"field": "starred",
"modifier": "none",
"factor": 2
}
}
},
"aggs" : {
"types" : {
"filters" : {
"filters" : {
"category1" : { "type" : { "value" : "category1"}},
"category2" : { "type" : { "value" : "category2"}},
"category3" : { "type" : { "value" : "category3"}},
"category4": { "type" : { "value" : "category4"}},
"category5" : { "type" : { "value" : "category5"}}
}
},
"aggs": {
"topFoundHits": {
"top_hits": {
"size": 5
}
}
}
}
}
}'
这里的想法是在许多分类文档中搜索与特定字符串查询匹配的所有文档。然后使用聚合我想按类别找到前五个结果文档。已加星标的项目会显示在其他搜索结果之上。
当我直接在终端输入上面列出的命令时这很有用,但是当我尝试将它放入pyes时它不起作用。我不知道最好的办法是什么。 pyes库的文档让我很难将它完全转换为pyes对象。
我试图执行以下操作:
query_dsl = self.get_text_index_query_dsl()
resulting_docs = conn.search(query=query_dsl)
(其中self.get_test_index_query_dsl
返回上面的查询dsl dict)
按原样搜索给了我一个:
ElasticSearchException: QueryParsingException[[test_index] No query registered for [query]]; }]
如果我删除了父"查询"映射并尝试:
query_dsl = {
"function_score": {
"query": {
"match_all": {}
},
"field_value_factor": {
"field": "starred",
"modifier": "none",
"factor": 2
}
},
"aggs" : {
"types" : {
"filters" : {
"filters" : {
"category1" : { "type" : { "value" : "category1"}},
"category2" : { "type" : { "value" : "category2"}},
"category3" : { "type" : { "value" : "category3"}},
"category4": { "type" : { "value" : "category4"}},
"category5" : { "type" : { "value" : "category5"}}
}
},
"aggs": {
"topFoundHits": {
"top_hits": {
"size": 5
}
}
}
}
}
}
这也会导致错误:ElasticSearchException: ElasticsearchParseException[Expected field name but got START_OBJECT "aggs"]; }]
除了pyes似乎没有“topFoundHits”这样的事实之外,还有这些错误。功能(我认为)正在阻碍我。
为什么会发生这种情况以及如何解决这个问题? 非常感谢你!
答案 0 :(得分:1)
我使用此库工作,您可以使用常规查询dsl JSON语法:http://elasticsearch-dsl.readthedocs.org/en/latest/。