2016-03-01 2 views
1

У нас есть эластичный поиск, сконфигурированный с помощью анализатора пробелов в нашем приложении. Слова лексемы на пробельном, поэтому имя как <fantastic> project индексируются вИспользование Elastic Search для извлечения содержимого тегов и дефисных слов

["<fantastic>", "project"] 

и ABC-123-определение проект индексируется в

["ABC-123-def", "project"] 

Когда мы затем искать abc- * появляется ожидаемый проект. Но, если мы специально будем искать <fantastic>, он вообще не появится. Как будто Lucene/Elastic Search игнорирует любой термин поиска, который включает угловые скобки. Однако, может найти fantastic, или <*fantastic* или *fantastic*, и он находит это хорошо, хотя слово не индексируется отдельно от угловых скобок.

Стандартный анализатор выполняет токенизацию на любом не-алфавитно-цифровом символе. <fantatsic> проект индексироваться

["fantastic", "project"] 

и ABC-123-определения проекта индексируются

["ABC", "123", "def", "project"] 

Это нарушает способность успешно поиск с помощью ABC-123-*. Однако то, что мы получаем со стандартным анализатором, состоит в том, что кто-то может затем специально искать <fantastic> и он возвращает желаемые результаты.

Если вместо стандартного анализатора мы добавим char_filter в пробельный анализатор, который отфильтровывает угловые скобки тегов, (замените <(.*)> с $1) он будет индексироваться таким образом: <fantatsic> project индексируется в

["fantastic", "project"] 

(без угловых кронштейнов). И ABC-123-определение проект индексируется в

["ABC-123-def", "project"] 

Это выглядит многообещающим, но мы в конечном итоге с тем же результатом, что и для обычного пробельных анализатора: Когда мы ищем специально для <fantastic>, мы не получим ничего, но *fantastic* работает нормально.

Может ли кто-нибудь из переполнения стека объяснить эту странность?

ответ

2

Вы можете создать Tokenizer для специальных символов, следующий пример

{ 
    "settings" : { 
     "index" : { 
      "number_of_shards" : 1, 
      "number_of_replicas" : 1 
     }, 
     "analysis" : { 
      "filter" : { 
       "custom_filter" : { 
        "type" : "word_delimiter", 
        "type_table": ["> => ALPHA", "< => ALPHA"] 
       } 
      }, 
      "analyzer" : { 
       "custom_analyzer" : { 
        "type" : "custom", 
        "tokenizer" : "whitespace", 
        "filter" : ["lowercase", "custom_filter"] 
       } 
      } 
     } 
    }, 
    "mappings" : { 
     "my_type" : { 
      "properties" : { 
       "msg" : { 
        "type" : "string", 
        "analyzer" : "custom_analyzer" 
       } 
      } 
     } 
    } 
} 

< > как ALPHA характер вызывает основной word_delimiter рассматривать их как алфавитные символы.

+1

Точно, что я искал, спасибо! – GLaDOS