Elasticsearch - Reindex одиночное поле с другим анализатором, используя Python - PullRequest
0 голосов
/ 01 марта 2020

Я использую динамическое отображение c вasticsearch для загрузки моего файла json вasticsearch, например:

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

def extract():
    f = open('tmdb.json')
    if f:
        return json.loads(f.read())

movieDict = extract()

def index(movieDict={}):

    for id, body in movieDict.items():
        es.index(index='tmdb', id=id, doc_type='movie', body=body)

index(movieDict)

Как я могу обновить отображение для одного поля? У меня есть поле title, к которому я хочу добавить другой анализатор.

title_settings = {"properties" : { "title": {"type" : "text", "analyzer": "english"}}}
es.indices.put_mapping(index='tmdb', body=title_settings)

Это не удалось.

Я знаю, что не могу обновить уже существующий индекс, но как правильно переиндексировать сопоставление, сгенерированное из файла json? В моем файле много полей, создание карт / настроек вручную было бы очень проблематично.

Я могу указать анализатор для запроса, например так:

query = {"query": {
            "multi_match": {
                "query": userSearch, "analyzer":"english", "fields": ['title^10', 'overview']}}} 

Как мне указать это для индекса или поля?

Я также могу установить анализатор в настройки после закрытия и открытия индекса

analysis = {'settings': {'analysis': {'analyzer': 'english'}}}
es.indices.close(index='tmdb')
es.indices.put_settings(index='tmdb', body=analysis)
es.indices.open(index='tmdb')

Копирование точных настроек для анализаторов engli sh не помогает 'активировать 'это для моих данных.

https://www.elastic.co/guide/en/elasticsearch/reference/7.6/analysis-lang-analyzer.html#english -анализатор

Под словом "активировать" я имею в виду, что поиск не возвращается в форме, обработанной анализатором engli sh ie. Есть еще стоп-слова.

1 Ответ

0 голосов
/ 03 марта 2020

Решено с огромным количеством поиска в Google ....

  1. Вы не можете изменить анализатор на уже проиндексированных данных. Это включает в себя открытие / закрытие индекса. Вы можете указать новый индекс, создать новое отображение и загрузить свои данные (самый быстрый способ)

  2. Указание анализатора для всего индекса не является хорошим решением, так как анализатор 'engli sh' указан c в текстовые поля. Лучше указывать анализатор по полю.

  3. Если анализаторы указаны по полю, вам также необходимо указать тип.

  4. Необходимо помнить, что анализаторы используются в могут быть использованы в / или индекс и время поиска. Ссылка Определение анализаторов

Код:

def create_index(movieDict={}, mapping={}):
    es.indices.create(index='test_index', body=mapping)

    start  = time.time()
    for id, body in movieDict.items():
        es.index(index='test_index', id=id, doc_type='movie', body=body)
    print("--- %s seconds ---" % (time.time() - start))

Теперь у меня есть mapping из динамического c отображения моего json файл. Я просто сохранил его обратно в json файл для удобства обработки (редактирования). Это потому, что у меня есть более 40 полей для сопоставления, делать это вручную было бы просто утомительно.

mapping = es.indices.get_mapping(index='tmdb')

Это пример того, как ключ title должен быть указан для использования english анализатор

'title': {'type': 'text', 'analyzer': 'english','fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}}

...