2014-11-18 13 views
1

Может ли кто-нибудь дать мне совет, что я делаю неправильно. Я пытаюсь настроить elasticsearch таким образомElasticsearch синонимы, чувствительные к регистру результаты

{ 
    "settings" : { 
     "index" : { 
      "analysis" : { 
       "analyzer" : { 
        "synonym" : { 
         "type" : "custom", 
         "tokenizer" : "whitespace", 
         "filter" : ["en_US", "lowercase", "synonym"] 
        } 
       }, 
       "filter" : { 
        "synonym" : { 
         "type" : "synonym", 
         "synonyms_path" : "analysis/synonym.txt" 
        }, 
        "en_US" : { 
         "type" : "hunspell", 
         "locale" : "en_US", 
         "dedup" : true 
        } 
       } 
      } 
     } 
    }, 
    "mappings" : { 
     "jdbc" : { 
      "properties" : { 
       "Title" : { 
        "type" : "string", 
        "search_analyzer" : "synonym", 
        "index_analyzer" : "standard" 
       }, 
       "Abstract" : { 
        "type" : "string", 
        "search_analyzer" : "synonym", 
        "index_analyzer" : "standard" 
       } 
      } 
     } 
    } 
} 

Мой файл synonym.txt содержит

beer, ale, lager, cark ale 
Lithuania, Republic of Lithuania, Lithuanian 

Так что пришло время, чтобы попробовать мой анализатор:

http://localhost:9200/jdbc/_analyze?text=beer&analyzer=synonym&pretty=true 

Он работает как ожидается и вернет меня

{ 
    "tokens" : [ { 
    "token" : "beer", 
    "start_offset" : 0, 
    "end_offset" : 4, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "ale", 
    "start_offset" : 0, 
    "end_offset" : 4, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "lager", 
    "start_offset" : 0, 
    "end_offset" : 4, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "cark", 
    "start_offset" : 0, 
    "end_offset" : 4, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "ale", 
    "start_offset" : 0, 
    "end_offset" : 4, 
    "type" : "SYNONYM", 
    "position" : 1 
    } ] 
} 

Однако, запрашивая это:

http://localhost:9200/jdbc/_analyze?text=Lithuanian&analyzer=synonym&pretty=true 

вернуться бы только:

{ 
    "tokens" : [ { 
    "token" : "lithuanian", 
    "start_offset" : 0, 
    "end_offset" : 10, 
    "type" : "word", 
    "position" : 1 
    } ] 
} 

Любые советы?

+0

возможно дубликат [Case нечувствительности не работает] (http://stackoverflow.com/questions/17266830/case-insensitivity-does-not-work) – BMW

+0

http://stackoverflow.com/questions/22522863/elasticsearch-case-insensitive-query-string-query-with-wildcards – BMW

ответ

1

В процессе анализа фильтры токенов применяются в указанном порядке. Итак, в приведенном выше случае «Литва» впервые преобразована в нижнюю букву «литовская». Поскольку файл синонимов не содержит эту версию токена, не происходит преобразований синонимов. Этот раздел в elasticsearch guide рассказывает об этом подробнее.

Есть два вы могли пути идти об этом в зависимости от случая использования либо изменить порядок маркеров фильтров в пользовательском анализаторе:

"synonym" : { 
     "type" : "custom", 
     "tokenizer" : "whitespace", 
      "filter" : ["en_US", "synonym","lowercase"] 
    } 

выше будет по-прежнему чувствителен к регистру, но преобразование будет согласуются с приведенным выше . synonyms.txt

Или вы можете сделать все синонимы в анализе/синониме.txt строчными и сохранить те же параметры анализатора, что и заданные в вопросе. Пример:

beer, ale, lager, cark ale 
    lithuania, republic of lithuania, lithuanian 
+0

Вот что я на самом деле делал. Создание каждого синонима в нижнем регистре было самым простым и быстрым решением для работы. Благодаря! –

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

  • Нет связанных вопросов^_^