Elasticsearch: подсказчик завершения отбрасывает ноль результатов - PullRequest
0 голосов
/ 20 февраля 2020

Используемая версия: 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 не возвращает никаких предложений?

...