У меня есть миллионы документов для индексации. Каждый документ имеет поля doc_id
, doc_title
и несколько полей doc_content
.
import requests
index = 'test'
JSON = {
"mappings": {
"properties": {
"doc_id": {"type": "keyword"},
"doc_title": {"type": "text" },
"doc_content": {"type": "text" }
}
}
}
r = requests.put(f'http://127.0.0.1:9200/{index}', json=JSON)
. Чтобы свести к минимуму размер индекса, я храню doc_title
и doc_content
отдельно.
docs = [
{"doc_id": 1, "doc_title": "good"},
{"doc_id": 1, "doc_content": "a"},
{"doc_id": 1, "doc_content": "b"},
{"doc_id": 2, "doc_title": "good"},
{"doc_id": 2, "doc_content": "c"},
{"doc_id": 2, "doc_content": "d"},
{"doc_id": 3, "doc_title": "bad"},
{"doc_id": 3, "doc_content": "a"},
{"doc_id": 3, "doc_content": "e"}
]
for doc in docs:
r = requests.post(f'http://127.0.0.1:9200/{index}/_doc', json=doc)
query_1:
JSON = {
"query": {
"match": {
"doc_title": "good"
}
}
}
r = requests.get(f'http://127.0.0.1:9200/{index}/_search', json=JSON)
[x['_source'] for x in r.json()['hits']['hits']]
[{'doc_id': 1, 'doc_title': 'good'}, {'doc_id': 2, ' doc_title ':' good '}]
query_2:
JSON = {
"query": {
"match": {
"doc_content": "a"
}
}
}
r = requests.get(f'http://127.0.0.1:9200/{index}/_search', json=JSON)
[x['_source'] for x in r.json()['hits']['hits']]
[{' doc_id ': 1,' doc_content ':' a '}, {' doc_id ': 3,' doc_content ':' a '}]
Как объединить query_1 и query_2?
Мне нужно что-то вроде этого:
JSON = {
"query": {
"bool": {
"must": [
{"match": {"doc_title": "good"}},
{"match": {"doc_content": "a"}}
]
}
}
}
r = requests.get(f'http://127.0.0.1:9200/{index}/_search', json=JSON)
[x['_source'] for x in r.json()['hits']['hits']]
[]
Желаемый результат:
[{'doc_id': 1, 'doc_title' : 'good', 'doc_content': 'a'}]