Elasticsearch - Nest - Mapping - многоцелевой псевдоним или указание только одного многополевого подполя для использования в документе - PullRequest
0 голосов
/ 12 марта 2020

У нас есть приложение, которое мы хотим перенести с solr наasticsearch. Я изо всех сил пытаюсь найти правильный способ сделать следующее (у нас есть 10 таких полей).

У нас есть текстовое поле, которое нужно индексировать и искать с использованием определенных анализаторов в зависимости от языка. Но нужно искать по тому же имени. Таким образом, в Solr мы можем иметь поля «title_fr» и «title_en» и иметь настройку псевдонима, которая будет возвращать / искать оба при поиске в поле «title», но в любой момент времени у нас заполнено только 1 из этих полей для каждого документа, и поэтому это работает.

Теперь я знаю, что вasticsearch псевдоним может иметь только 1 цель, поэтому я начал изучать несколько полей. Но проблема с несколькими полями, которую я вижу, состоит в том, что она хранит, создает и индексирует для каждого подполя в ней. Таким образом, если у меня есть мультиполе с именем title, а затем подполе с именем title.en и одно с именем title.fr, если я добавлю для индексации заголовок, он будет добавлен как в title.en, так и в title.fr, используя указанные анализаторы. Это становится проблемой, потому что поиск в заголовке вызовет анализатор поиска для обоих и вернет потенциальные ложные срабатывания на противоположном языке. Не говоря уже о том, что он также удваивает наш размер индекса.

Другие варианты, которые я видел, - это создание индекса для каждого языка и создание перекрестного псевдонима.

Я использую C# Nest для сделайте эту работу тоже, если это поможет.

1 Ответ

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

Вы можете иметь title_fr и title_en как отдельное поле

Отображения:

"mappings":{
    "properties":{
        "title_fr":{
            "type":"text",
            "analyzer":<your_analyzer>                                
        },
        "title_en":{
            "type":"text",
            "analyzer":<your_analyzer>                                
        }
    }
}

Вы также можете настроить их как объекты или вложенный тип

"title":{
    type:"object",
    "properties":{
        "title_fr":{
            "type":"text",
            "analyzer":"your_analyzer"
        },
        "title_en":{
            "type":"text",
            "analyzer":"your_analyzer"
        }
    }
}

Существует много опций, доступных вasticsearch для запроса текста в нескольких полях, например. Вы можете использовать multi_match

{
    "query": {
        "multi_match" : {
            "query":    "<text>",
            "fields": [ "title_fr", "title_en" ]  --> or title.title_fr,title.title_en 
        }
    }
}

Query_string

{
    "query" : {
        "query_string" : {
            "query" : "<text>",
            "fields"  : [ "title_fr", "title_en" ]  --> or title.title_fr,title.title_en 
        }
    }
}
...