2016-02-07 2 views
0

Я нахожусь в плотном графике для демонстрации с помощью Elastic Search.Пользовательский тип для частичного поиска слов в Elastic Search

Я установил свою базу данных, использовал вход JDBC с Logstash и начал индексировать таблицы базы данных. Его все работает отлично в некоторой степени. Но частичный поиск слов не работает. Быстрый поиск в эластичных документах предложил фильтры nGram и стволовые клетки. Поскольку я не получал стволовых клеток, я пошел по пути фильтров ngram.

Ниже мое отображение индекса,

{ 
 
"settings" : { 
 
\t "analysis" : { 
 
\t \t "analyzer" : { 
 
\t \t \t "translation_index_analyzer" : { 
 
\t \t \t \t "type" : "custom", 
 
\t \t \t \t "tokenizer" : "standard", 
 
\t \t \t \t "filter" : "standard, lowercase, translation" 
 
\t \t \t }, 
 
\t \t \t "translation_search_analyzer" : { 
 
\t \t \t \t "type" : "custom", 
 
\t \t \t \t "tokenizer" : "standard", 
 
\t \t \t \t "filter" : "standard, lowercase" 
 
\t \t \t } \t \t 
 
\t \t }, 
 
\t \t "filter" : { 
 
\t \t \t "translation" : { 
 
\t \t \t \t "type" : "nGram", 
 
\t \t \t \t "min-gram" : 3, 
 
\t \t \t \t "max-gram" : 12 
 
\t \t \t } 
 
\t \t } 
 
    \t } 
 
}, 
 
"mappings" : { 
 
     "type" : { 
 
\t \t "properties" : { 
 
\t \t  "myType" : { 
 
\t \t \t "type" : "string", 
 
         "index_analyzer" : "translation_index_analyzer", 
 
         "search_analyzer" : "translation_search_analyzer" 
 
\t \t  } \t 
 
\t \t } 
 
     }, 
 
     "employee" : { 
 
      "properties" : { 
 
         "birth_date": { 
 
          "type": "date", 
 
          "format" : "yyyy-MM-dd HH:mm:ss ZZ" 
 
      }, 
 
      "emp_no": { 
 
        "type": "long", 
 
        "index" : "not_analyzed" 
 
      }, 
 
      "first_name": { 
 
      "type": "myType" 
 
      }, 
 
      "gender": { 
 
      "type": "string", 
 
       "index" : "not_analyzed" 
 
      }, 
 
      "hire_date": { 
 
          "type": "date", 
 
          "format" : "yyyy-MM-dd HH:mm:ss ZZ" 
 
     }, 
 
      "last_name": { 
 
      "type": "string" 
 
      } 
 
      } 
 
     } 
 
    } 
 

я скорее угадал отображение типа, как мне нужно что-то вроде этого отчаянно. Не уверен, правильно ли это.

Когда я после этого я получаю ошибку

{ 
 
    "error": { 
 
    "root_cause": [ 
 
     { 
 
     "type": "mapper_parsing_exception", 
 
     "reason": "analyzer on field [myType] must be set when search_analyzer is set" 
 
     } 
 
    ], 
 
    "type": "mapper_parsing_exception", 
 
    "reason": "Failed to parse mapping [type]: analyzer on field [myType] must be set when search_analyzer is set", 
 
    "caused_by": { 
 
     "type": "mapper_parsing_exception", 
 
     "reason": "analyzer on field [myType] must be set when search_analyzer is set" 
 
    } 
 
    }, 
 
    "status": 400 
 
}

Любые подсказки, где я ошибся?

UPDATE: Моя упругая версия 2,2
переход от index_analyzer к анализатору дал другую ошибку

{ 
 
    "error": { 
 
    "root_cause": [ 
 
     { 
 
     "type": "mapper_parsing_exception", 
 
     "reason": "No handler for type [myType] declared on field [first_name]" 
 
     } 
 
    ], 
 
    "type": "mapper_parsing_exception", 
 
    "reason": "Failed to parse mapping [employee]: No handler for type [myType] declared on field [first_name]", 
 
    "caused_by": { 
 
     "type": "mapper_parsing_exception", 
 
     "reason": "No handler for type [myType] declared on field [first_name]" 
 
    } 
 
    }, 
 
    "status": 400 
 
}

FINAL РЕШЕНИЕ: Ну, моя проблема была с определением тип. Что я буду игнорировать на данный момент, но частичный поиск работает со следующими установки

{ 
 
"settings" : { 
 
      "analysis" : { 
 
       "analyzer" : { 
 
        "my_ngram_analyzer" : { 
 
         "tokenizer" : "my_ngram_tokenizer" 
 
        } 
 
       }, 
 
       "tokenizer" : { 
 
        "my_ngram_tokenizer" : { 
 
         "type" : "nGram", 
 
         "min_gram" : "3", 
 
         "max_gram" : "12", 
 
         "token_chars": [ "letter", "digit" ] 
 
        } 
 
       } 
 
      } 
 
}, 
 
    
 
"mappings" : { 
 
    
 
     "employee" : { 
 
      "properties" : { 
 
         "birth_date": { 
 
          "type": "date", 
 
          "format" : "yyyy-MM-dd HH:mm:ss ZZ" 
 
      }, 
 
      "emp_no": { 
 
        "type": "long", 
 
        "index" : "not_analyzed" 
 
      }, 
 
      "first_name": { 
 
      "type": "string", 
 
         "analyzer" : "my_ngram_analyzer", 
 
         "search_analyzer" : "my_ngram_analyzer" 
 
      }, 
 
      "gender": { 
 
      "type": "string", 
 
       "index" : "not_analyzed" 
 
      }, 
 
      "hire_date": { 
 
          "type": "date", 
 
          "format" : "yyyy-MM-dd HH:mm:ss ZZ" 
 
      }, 
 
      "last_name": { 
 
      "type": "string", 
 
         "analyzer" : "my_ngram_analyzer", 
 
         "search_analyzer" : "my_ngram_analyzer" 
 
      } 
 
      } 
 
     } 
 
    } 
 
}

+0

Что версия elasticsearch? –

ответ

0

Моя догадка, изменить index_analyzer с analyzer

  • Это зависит ваша elasticsearch версия

EDIT

Я не знаком с созданием типа, но вы можете инициализировать first_name с соответствующим анализатором:

"first_name": { 
    "type" : "string", 
    "analyzer" : "translation_index_analyzer", 
    "search_analyzer" : "translation_search_analyzer" 
}, 
+0

Упругая версия 2.2 самая последняя. – Ish

+0

Я обновил вопрос – Ish

+0

Спасибо @Roy Shmuli, я тоже это пробовал. то это не дает мне никаких ошибок при частичном поиске, не работает. Есть ли способ увидеть токенированный вывод? В конце я должен индексировать около 150 столбцов. Вот почему я подумал о специальном типе, который делает его чистым и легким. – Ish