Используемая версия: Elasticsearch 1.7 с библиотекой elasticsearch-py
Python.
Я работаю над включением функции подсказки завершения для моего индекса ES. Мне известно о достижении 1.7 EOL, но я должен заставить его работать над этим.
Что я определил в отображении:
"mappings": {
"questions": {
"_id": {"store": "yes", "path": "id"},
"_source": {"enabled": True},
"properties": {
"id": {"type": "integer"},
"question": {
"type": "string",
"search_analyzer": "query_analyzer",
"index_analyzer": "ngram_analyzer",
"fields": {
"raw": {"type": "string", "index": "analyzed"}
}
},
"answer": {"type": "string"},
"category": {
"type": "nested",
"properties": {
"id": {"type": "integer"},
"name": {"type": "string"}
}
},
"suggest": {
"type": "completion",
"index_analyzer": "simple",
"search_analyzer": "simple",
"payloads": True
}
}
}
}
Что я индексирую:
{
'id': 504,
'question': 'What all jobs can I target?',
'answer': '1. Public Prosecutor\n2. Standing Counsel\n3. Legal experts\n4. Judge\nand many more.',
'category': [{'id': 13, 'name': 'General'}],
'suggest': {
'input': ['jobs', 'target'],
'output': 'What all jobs can I target?',
'payload': {'id': 504},
'weight': 1
}
}
Обратите внимание, что я использую библиотеку elasticsearch-py
Python для отображения и индексации. Код отображения такой:
self.base_index_name = 'faqs'
self.doc_type = 'question'
self.index_client = IndicesClient(self.es)
self.index_name = self._create_q_index()
qs = Questions.objects.all().distinct()
itemcount = 0
for question in qs:
try:
print("Indexing",itemcount,"/",qs.count(),end="\r")
itemcount += 1
question_dict = self.prep_q(question) # returns the document above in Python dictionary format
self.index_q(question_dict, delete_elastic_cache=False)
sys.stdout.flush()
except Exception as ex:
print("reindex_error", ex)
import traceback
traceback.print_tb(ex.__traceback__)
print(itemcount,"FAQs indexed")
self._create_alias()
self.index_client.clear_cache()
Функция self.index_q()
определена так:
def index_q(self, q_body, delete_elastic_cache=True):
self.es.index(
index=self.index_name,
doc_type=self.doc_type,
id=q_body['id'],
body=q_body,
timeout=20
)
if delete_elastic_cache:
self.index_client = IndicesClient(self.es)
self.index_client.clear_cache(id=q_body['id'])
И, наконец, то, что я запрашиваю:
POST http://localhost:9200/faqs/_suggest -d "
{
"question_suggest": {
"text": "jobs target",
"completion": {
"field": "suggest"
}
}
}
"
Это все, что я получаю от Elasticsearch:
{
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"question_suggest": [
{
"text": "jobs target",
"offset": 0,
"length": 22,
"options": []
}
]
}
Я попробовал пример в документации , и это сработало, но не этот код. Из того, что я мог видеть, оба индекса одинаково распознаются с помощью средств Completion Suggester, и журналы Elasticsearch не выдают никаких исключений.
Почему ES не возвращает никаких предложений?