我正在尝试使用自定义查询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“映射并尝试:
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‘功能的事实(我认为)阻碍了我的脚步。
你知道为什么会发生这种情况,以及如何解决吗?非常感谢!
发布于 2015-11-26 02:56:33
我使用这个库实现了这一点,在这个库中,您只需使用常规查询dsl JSON语法:http://elasticsearch-dsl.readthedocs.org/en/latest/。
https://stackoverflow.com/questions/33921558
复制相似问题