2015-05-28 71 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" 
} 

當我試圖用查詢字符串「Chevy sivlerado」進行搜索,同義詞與Silverado完全匹配並返回結果,相反,當我試圖通過查詢字符串「2500 HD」搜索時返回0結果。我嘗試了涉及數字的同義詞的不同組合,並發現彈性搜索同義詞映射器不支持數字,這是正確的嗎?

有沒有什麼辦法可以讓一些映射時爲「2500高清」用戶搜索,我可以映射查詢「2500HD」

+0

你還沒說你使用的查詢。你如何做你的疑問?你能給個例子嗎? –

回答

0

確定這裏是你的問題:

  • 你嘗試定義試圖過濾合併「2500高清」到「2500HD」搜索
  • 但是,分析儀將這樣工作:

    • 執行char_filter冷杉T(如果有的話)
    • 先進行分詞,這是你的定義standard,因此「2500高清」將被分成兩個方面2500HD
    • 後進行過濾,這將轉化方面爲2500hd。您的過濾器synonyms將被忽略,因爲它們都不匹配傳遞的過濾器。

所以,當你查詢 「2500高清」,你實際上搜索2500hd。由於索引條款是2500hd,因此沒有匹配的文檔。

我更喜歡你更換你synonymsword_delimiter過濾器,這樣的事情:

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

它會改變你的文檔2500HD2500hd2500hd。因此它將匹配查詢「2500 HD」,該查詢將被轉換爲2500hd。請參閱文檔鏈接以瞭解更多選項。

你不需要定義這樣的同義詞過濾器。如果您實際上想要像您當前的定義那樣進行轉換,請定義另一個標記器,而不是使用標記化器standard

P/S:您可以安裝插件打破砂鍋看條款將如何進行分析:https://github.com/polyfractal/elasticsearch-inquisitor

+0

非常感謝,單詞分隔符解決了我的問題 –