Elasticsearch nhiều truy vấn / tìm kiếm với Python
Tôi mới sử dụng Python và Elasticsearch và tôi đã tạo một chỉ mục với một số dữ liệu trong Elasticsearch và tôi muốn thực hiện truy vấn chúng bằng Python dựa trên một số bộ lọc nhận được từ người dùng (từ khóa, danh mục)
from elasticsearch import Elasticsearch
import json,requests
es = Elasticsearch(HOST="http://localhost", PORT=9200)
es = Elasticsearch()
def QueryMaker (keyword,category):
response = es.search(index="main-news-test-data",body={"from":0,"size":10000,"query":{
"bool": {
"should": [
{
"multi_match" : {
"query": keyword,
"fields": [ "content", "title","lead" ]
}
},
{
"multi_match" : {
"query": category,
"fields": [ "category" ]
}
}
]
}
}})
return(response)
def Mapper (category):
fhandle = open('categories.txt','r', encoding="utf8")
for line in fhandle:
line = line.rstrip()
items = line.split(';')
if f'"{category}"' in items:
category = items[0]
return(category)
if __name__ == '__main__':
keyword = input('Enter Keyword: ')
print(type(keyword))
category = input('Enter Category: ')
print(type(category))
#startDate = input('Enter StartDate: ')
#endDate = input('Enter EndDate: ')
mapCategory = Mapper(category)
if mapCategory is not None:
mapCategory = mapCategory.replace("%","")
data = QueryMaker(keyword,mapCategory)
print(data)
else:
data = QueryMaker(keyword,mapCategory)
print(data)
Vấn đề là chương trình này chỉ trả về dữ liệu phù hợp chỉ khi 2 trường đầy, nhưng tôi cũng muốn nó trả về dữ liệu nếu 1 trường như thể loại trống. Khi Từ khoá trống, nó giống như '' và không trả lại gì và khi Danh mục trống, tôi nhận được lỗi này:
elasticsearch.exceptions.RequestError: RequestError(400, 'x_content_parse_exception', '[multi_match] unknown token [VALUE_NULL] after [query]')
Tôi đang làm gì sai và làm cách nào để sửa bộ lọc tìm kiếm?
Trả lời
Thêm một ví dụ làm việc với dữ liệu chỉ mục, truy vấn tìm kiếm và kết quả tìm kiếm
Theo nhận xét của bạn đã đề cập ở trên, nếu contenttrường không chứa keywordvà nếu categorytrường chứa category, thì truy vấn tìm kiếm sẽ thực thi cho categorytrường. Điều này có thể đạt được bằng cách sử dụngminimum_should_match
Dữ liệu chỉ mục:
{
"content": "keyword a",
"title": "b",
"lead": "c",
"category": "d"
}
{
"content": "a",
"title": "b",
"lead": "c",
"category": "category"
}
{
"content": "keyword a",
"title": "b",
"lead": "c",
"category": "category"
}
Truy vấn Tìm kiếm:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "keyword",
"fields": [
"content",
"title",
"lead"
]
}
},
{
"multi_match": {
"query": "category",
"fields": [
"category"
]
}
}
],
"minimum_should_match":1
}
}
}
Tìm kêt quả:
"hits": [
{
"_index": "stof_64081587",
"_type": "_doc",
"_id": "3",
"_score": 0.9666445,
"_source": {
"content": "keyword a",
"title": "b",
"lead": "c",
"category": "category"
}
},
{
"_index": "stof_64081587",
"_type": "_doc",
"_id": "2",
"_score": 0.60996956,
"_source": {
"content": "keyword a",
"title": "b",
"lead": "c",
"category": "d"
}
},
{
"_index": "stof_64081587",
"_type": "_doc",
"_id": "1",
"_score": 0.35667494,
"_source": {
"content": "a",
"title": "b",
"lead": "c",
"category": "category"
}
}
]