Elasticsearch - 如何将范围过滤器添加到搜索查询
Elasticsearch - How to add range filter to search query
我使用 elasticsearch-dsl 以便在 python 中查询 Elasticsearch。
我想搜索 text
字段的文档,并获取 created
字段小于 datetime.now()
的所有文档。
我执行以下查询但 elasticsearch 引发错误。
q = "some word"
es.search(
index="comment",
body={
"query": {
"query_string": {
"query": f"*{q}*" ,
"default_field": "text"
},
"range": {"created": {"lt": datetime.now()}}
},
"fields": ["id"],
"size": 10
},
)
elasticsearch错误如下:
elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[query_string] malformed query, expected [END_OBJECT] but found [FIELD_NAME]')
注意:当我评论 "range": {"created": {"lt": datetime.now()}}
时,查询将正常工作(但未应用日期时间过滤器)。
您不能像这样组合几种类型的查询,请使用 bool:
{
"query": {
"bool": {
"must": [{"query_string": {"query": f"*{q}*" , "default_field": "text"}}],
"filter": [{"range": {"created": {"lt": datetime.now()}}}]}
}
}
}
注意 full-text query_string
子句进入 must
部分并获得评分,而 range
过滤器进入 filter
且 ES 不计算分数对于这些。
我使用 elasticsearch-dsl 以便在 python 中查询 Elasticsearch。
我想搜索 text
字段的文档,并获取 created
字段小于 datetime.now()
的所有文档。
我执行以下查询但 elasticsearch 引发错误。
q = "some word"
es.search(
index="comment",
body={
"query": {
"query_string": {
"query": f"*{q}*" ,
"default_field": "text"
},
"range": {"created": {"lt": datetime.now()}}
},
"fields": ["id"],
"size": 10
},
)
elasticsearch错误如下:
elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[query_string] malformed query, expected [END_OBJECT] but found [FIELD_NAME]')
注意:当我评论 "range": {"created": {"lt": datetime.now()}}
时,查询将正常工作(但未应用日期时间过滤器)。
您不能像这样组合几种类型的查询,请使用 bool:
{
"query": {
"bool": {
"must": [{"query_string": {"query": f"*{q}*" , "default_field": "text"}}],
"filter": [{"range": {"created": {"lt": datetime.now()}}}]}
}
}
}
注意 full-text query_string
子句进入 must
部分并获得评分,而 range
过滤器进入 filter
且 ES 不计算分数对于这些。