#lucene #elasticsearch
#lucene #elasticsearch
Вопрос:
Я хочу указать анализаторы для каждого поля в elasticsearch. Для некоторых полей мне нужен анализатор ключевых слов, а для одного мне нужен пользовательский анализатор чисел, который удалит все нецифровые символы (см. number_analyzer
Код ниже)
Запрос, который создает индекс, является
{
"settings": {
"analysis" : {
"analyzer" : {
"number_analyzer" : {
"type": "custom",
"tokenizer": "keyword",
"filter": ["lowercase"],
"char_filter": ["number_filter"]
}
},
"char_filter" : {
"number_filter" : {
"type": "pattern_replace",
"pattern": "[\d] ",
"replacement": ""
}
}
}
}
}
Сопоставление для полей
{
"properties": {
"field1": {
"type": "string",
"store": "yes",
"index": "analyzed",
"analyzer": "number_analyzer"
},
"field2": {
"type": "string",
"store": "yes",
"index": "not_analyzed",
"analyzer": "keyword"
},
"field3": {
"type": "string",
"store": "true",
"index": "not_analyzed"
},
"field4": {
"type": "string",
"store": "yes",
"index": "analyzed"
},
"field5": {
"type": "string",
"store": "yes",
"index": "analyzed",
"analyzer": "number_analyzer"
}
}
}
Когда я вставляю следующий документ в индекс
{
"field1" : "464533AB",
"field2" : "Euro",
"field3" : "THIS IS A TITLE",
"field4": "DEED_TYPE",
"field5":"TEST3"
}
Я замечаю, что символы из field1 не удаляются (моя цель — сохранить 464533
только), а также то, что я могу получить результаты для запроса field4:DEED_TYPE
, хотя я не должен (я думаю, что стандартный анализатор удалит специальный символ и выполнит строчные буквы, поэтому я ожидаю field4:DEED_TYPE
работать только с ключевым словоманализатор).
Есть ли какая-либо ошибка в том, как анализаторы указаны в приведенном выше коде?
Ответ №1:
Как правило, во время запроса будут применяться те же правила анализа, что и во время индексации. Поэтому, когда вы ищете:
field4:"DEED_TYPE"
этот запрос будет проанализирован и станет:
field4:"deed type"
Аналогично, анализ не влияет на сохраненную версию поля, на которую, я полагаю, вы ссылаетесь в field1 . Сохраненная версия поля, то есть версия, полученная из индекса в качестве результата поиска. Таким образом, даже если буквы будут удалены при анализе, это отразится только на том, как вы сможете выполнять поиск данных. Если вы хотите изменить сохраненное представление поля, это следует выполнить в качестве предварительной обработки, прежде чем переходить к анализу lucene. Анализаторы обычно не являются инструментом, используемым для этого.
Однако ваш number_filter неверен, у вас он задом наперед. Должно быть:
"number_filter" : {
"type": "pattern_replace",
"pattern": "[^\d] ",
"replacement": ""
}
[\d]
соответствует всем цифрам. По вашему описанию, вы хотите удалить все, кроме цифр, таким образом [^\d]