I use elasticsearch-dsl in order to query Elasticsearch in python.
I want to search documents with text
field and get all documents that created
field of them is less than datetime.now()
.
I execute the following query but elasticsearch raises error.
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
},
)
The following is elasticsearch error:
elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[query_string] malformed query, expected [END_OBJECT] but found [FIELD_NAME]')
Note: When I comment "range": {"created": {"lt": datetime.now()}}
, the query will work without error (but datetime filter is not applied).
You can't combine few types of queries like this, use bool :
{
"query": {
"bool": {
"must": [{"query_string": {"query": f"*{q}*" , "default_field": "text"}}],
"filter": [{"range": {"created": {"lt": datetime.now()}}}]}
}
}
}
Notice that full-text query_string
clause goes into must
section and gets scored while range
filter goes to filter
and ES doesn't calculate scores for these.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.