2014-06-20 4 views
1

Я хочу указать для каждого анализатора поля в поиске elastics. Для некоторых полей мне нужен анализатор ключевых слов, в то время как для одного мне нужен собственный анализатор номер, который удалит все нецифровые символы (см 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" 
} 

Я заметил, что символы из поля1 не удалены (моя цель состоит в том, чтобы сохранить только 464533), а также что я могу получить результаты по запросу field4:DEED_TYPE, хотя я не должен (я думаю, что стандартный анализатор удалит специальный символ и выполнить строчные буквы, поэтому я ожидал бы, что field4:DEED_TYPE будет работать только с анализатором ключевых слов).

Есть ли ошибка в том, как анализаторы указаны в приведенном выше коде?

ответ

0

Как правило, те же правила анализа будут применяться во время запроса, как применяются во время индекса. Поэтому, когда вы ищете:

field4:"DEED_TYPE" 

, что запрос будет проанализирован, и стать:

field4:"deed type" 

Аналогичным образом, анализ не влияет на сохраненную версию поля, которую я считаю, это то, что вы имеете в виду в поле1. Сохраненная версия поля, то есть версия, полученная из индекса в качестве результата поиска. Поэтому даже если буквы будут удалены в анализе, это отразится только на том, как вы можете искать данные. Если вы хотите, чтобы изменить сохраненное представление поля, которое должно быть выполнено как предварительная обработка, перед тем как попасть в анализ lucene. Анализаторы обычно не являются инструментом, используемым для этого.

Ваш номер_фильтр ошибочен, хотя у вас есть он в обратном направлении. Должно быть:

"number_filter" : { 
    "type": "pattern_replace", 
    "pattern": "[^\\d]+", 
    "replacement": "" 
} 

[\\d]+ матчи все цифры. По вашему описанию вы хотите удалить все, кроме цифр, таким образом [^\\d]+

Смежные вопросы