2015-05-28 6 views
0

У меня есть документы, индексированные в эластичном кластере с приведенным ниже отображением. в основном у меня есть поле с именем модели, которая хранит имена автомобилей модели, такие как «Silverado 2500HD», «Silverado 1500HD» «LX 350» и т.д. и т.п.Эластичный синоним поиска с числовыми символами

POST /location-test-no-boost { 
    "settings":{ 
     "analysis":{ 
      "analyzer":{ 
       "mysynonym":{ 
        "tokenizer":"standard", 
        "filter":[ 
         "standard","lowercase","stop","mysynonym" 
        ], 
        "ignore_case":true 
       } 
      }, 
      "filter":{ 
       "mysynonym":{ 
        "type":"synonym", 
        "synonyms": [ 
          "2500 HD=>2500HD", 
          "chevy silverado=>Silverado" 
         ] 
       } 
      } 
     } 
    }, 
    "mappings":{ 
     "vehicles":{ 
      "properties":{ 
       "id":{ 
        "type":"long", 
        "ignore_malformed":true 
       }, 
       "model":{ 
        "type":"String", 
        "index_analyzer": "standard", 
        "search_analyzer":"mysynonym" 
       } 
      } 
     } 
    } 
} 

Содержание образца документ

POST /location-test-no-boost/vehicles/10 
{ 
    "model" : "Silverado 2500HD" 
} 

Когда я попытался выполнить поиск с строкой Query «Chevy sivlerado», синоним отлично соответствует Silverado и возвращает результат, наоборот, когда я попытался выполнить поиск по строке запроса «2500 HD», он возвращает 0 результатов. Я пробовал различную комбинацию на синониме с номером и обнаружил, что эластичный синоним поиска не поддерживает номера, это правильно?

есть ли способ, что я могу сделать некоторое отображение, когда пользователь ищет «2500 HD», я могу отобразить запрос «2500HD»

+0

Вы не сказали, что вы используете для запроса. Как вы выполняете свои запросы? Можете ли вы привести пример? –

ответ

0

Ok вот ваша проблема:

  • Вы пытаетесь определить фильтр, который пытаются объединить «2500 HD» в «2500HD» для поиска
  • Но анализатор будет работать так:

    • Выполните char_filter пихты т (если таковые имеются)
    • Выполните Tokenizer первый, который находится в вашем определении standard, следовательно, «2500 HD» будет разделен на два слагаемых 2500, HD
    • Выполните фильтры после того, как та, которая преобразует условия в 2500, hd. Ваш фильтр synonyms будет проигнорирован, потому что ни один из них не соответствует прошедшему фильтру.

Итак, когда вы запрашиваете "2500 HD", вы на самом деле искать 2500 и hd. И ни один из документов не согласован с индексированными условиями: 2500hd.

Я предпочитаю, чтобы вы заменить synonyms с word_delimiter фильтром, что-то вроде этого:

"filter":{ 
     "my_delimiter":{ 
       "type":"word_delimiter", 
       "preserve_original": true 
     } 
} 

Это превратит ваш документ 2500HD в 2500hd, 2500, hd. И, следовательно, он будет соответствовать запросу «2500 HD», который будет преобразован в 2500, hd. Для получения дополнительных сведений см. Ссылку документа.

Вам не нужно определять фильтр синонимов. Если вы действительно хотите преобразовать, как ваши текущие определения, пусть определите еще один токенизатор вместо использования токенизатора standard.

P/S: Вы можете установить плагин инквизитор, чтобы увидеть, как будут проанализированы условия: https://github.com/polyfractal/elasticsearch-inquisitor

+0

Большое спасибо, разделитель слов решил мою проблему –

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