Многоязычный индекс Elasticsearch

Я индексирую кучу документов на разных языках и, насколько я понимаю, могу указать, какой анализатор использовать для каждого документа во время индексации в одном из полей документа, используя отображение _analyzer:

см. http://www.elasticsearch.org/guide/reference/mapping/analyzer-field.html

По сути, во французском документе в поле языка установлено значение «французский», что указывает Elasticsearch, что ему необходимо применить французские правила выделения корней и удалить французские стоп-слова.

Теперь мне нужно указать анализатор во время запроса, чтобы Elasticsearch мог применить те же правила определения корней к запросу перед его фактической обработкой? Если так, то это немного обидно, потому что я хотел бы иметь возможность выполнять поиск по всему индексу, в конечном итоге предоставляя пункт «следует», отдавая предпочтение документам на одном языке над другими.

Я не знаю, создает ли Elasticsearch несколько запросов, применяя все анализаторы, которые до сих пор использовались в индексе, или нет. Если это не так, единственное решение, которое я вижу, - это разделить документы в соответствии с их языком на разные типы, а затем запустить несколько запросов параллельно и иметь какую-то функцию приемника на клиенте, которая объединяет результаты и сортирует их по их оценке. Но, хотя я мог бы отправить массовый запрос (чтобы ограничить круговые обходы сети), это решение явно не оптимально.

Есть предположения?


person Marca Tatem    schedule 24.04.2014    source источник


Ответы (1)


Вы можете определить отдельные анализаторы для индексации и поиска:

 "my_field":{
    "type":"string",
    "index_analyzer":"my_index_analyzer",
    "search_analyzer":"my_search_analyzer"
 }

Вы также можете указать анализаторы по умолчанию в настройках индекса - вот пример из реальной жизни:

"settings":{
    "number_of_shards":5,
    "number_of_replicas":1,
    "analysis":{
        "analyzer":{
            "default_index":{
                "type":"custom",
                "tokenizer":"whitespace",
                "filter":[
                    "trim",
                    "lowercase",
                    "asciifolding"
                ]
            },
            "default_search":{
                "type":"custom",
                "tokenizer":"keyword",
                "filter":[
                    "trim",
                    "lowercase",
                    "asciifolding"
                ]
            }
        }
    }
}

Таким образом, вам не нужно явно указывать поле _analyzer

person Shote    schedule 19.06.2014