Python을 사용한 Elasticsearch 다중 쿼리 / 검색
Sep 26 2020
저는 Python 및 Elasticsearch를 처음 사용하고 Elasticsearch에서 일부 데이터로 인덱스를 생성했으며 사용자로부터받은 일부 필터 (키워드, 카테고리)를 기반으로 Python으로 쿼리를 수행하려고합니다.
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)
문제는이 프로그램은 2 개의 필드가 가득 찬 경우에만 일치하는 데이터를 반환하지만 카테고리와 같은 1 개의 필드가 비어있는 경우에도 데이터를 반환하고 싶습니다. 키워드가 ''와 같이 비어 있고 아무것도 반환하지 않고 카테고리가 비어 있으면이 오류가 발생합니다.
elasticsearch.exceptions.RequestError: RequestError(400, 'x_content_parse_exception', '[multi_match] unknown token [VALUE_NULL] after [query]')
내가 뭘 잘못하고 있으며 검색 필터를 어떻게 수정할 수 있습니까?
답변
ESCoder Sep 27 2020 at 01:57
인덱스 데이터, 검색 쿼리 및 검색 결과로 작업 예제 추가
위에서 언급 한 의견에 따르면 content필드에이 포함되어 있지 않고 필드에이 포함되어 keyword있으면 category필드에 category대한 검색 쿼리가 실행됩니다 category. 이것은 다음을 사용하여 얻을 수 있습니다.minimum_should_match
인덱스 데이터 :
{
"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"
}
검색어:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "keyword",
"fields": [
"content",
"title",
"lead"
]
}
},
{
"multi_match": {
"query": "category",
"fields": [
"category"
]
}
}
],
"minimum_should_match":1
}
}
}
검색 결과:
"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"
}
}
]