2014-06-20 133 views
1

我想在elasticsearch中指定每場分析器。對於一些字段我需要的關鍵字分析儀,而對於一個我需要自定義數字分析器,將刪除所有的非數字字符(見number_analyzer在下面的代碼)彈性搜索分析器

創建該索引是

{ 
    "settings": { 
     "analysis" : { 
      "analyzer" : { 
       "number_analyzer" : { 
        "type": "custom", 
        "tokenizer": "keyword", 
        "filter": ["lowercase"], 
        "char_filter": ["number_filter"] 
       } 
      }, 
      "char_filter" : { 
       "number_filter" : { 
        "type": "pattern_replace", 
        "pattern": "[\\d]+", 
        "replacement": "" 
       } 
      } 
     } 
    } 
} 
請求

爲字段的映射是

{ 
     "properties": { 
      "field1": { 
       "type": "string", 
       "store": "yes", 
       "index": "analyzed", 
       "analyzer": "number_analyzer" 
      }, 
      "field2": { 
       "type": "string", 
       "store": "yes", 
       "index": "not_analyzed", 
       "analyzer": "keyword" 
      }, 
      "field3": { 
       "type": "string", 
       "store": "true", 
       "index": "not_analyzed" 
      }, 
      "field4": { 
       "type": "string", 
       "store": "yes", 
       "index": "analyzed" 
      }, 
      "field5": { 
       "type": "string", 
       "store": "yes", 
       "index": "analyzed", 
       "analyzer": "number_analyzer" 
      } 
     } 
} 

當我在索引

{ 
    "field1" : "464533AB", 
    "field2" : "Euro", 
    "field3" : "THIS IS A TITLE", 
    "field4": "DEED_TYPE", 
    "field5":"TEST3" 
} 
插入以下文件3210

我注意到字段1中的字符沒有被刪除(我的目標是隻保留464533),並且我能夠得到結果的查詢field4:DEED_TYPE,雖然我不應該(我認爲標準分析器將刪除特殊字符和小寫字母,所以我期望field4:DEED_TYPE只能與關鍵字分析器一起使用)。

在上面的代碼中指定分析器的方式是否有任何錯誤?

回答

0

通常,在查詢時將應用相同的分析規則,這與在索引時應用的​​一樣。所以,當你搜索:

field4:"DEED_TYPE" 

該查詢將被分析,併成爲:

field4:"deed type" 

同樣,分析不會影響領域,我相信所存儲的版本你是指什麼到field1。存儲的字段版本,即從索引檢索的版本作爲搜索結果。因此,即使分析中的字母被刪除,這也只會反映在您如何搜索數據。如果想要更改字段的存儲表示形式,則應在完成lucene分析之前完成預處理。分析儀通常不是用於此的工具。

你的number_filter是錯誤的,但你有它倒退。應該是:

"number_filter" : { 
    "type": "pattern_replace", 
    "pattern": "[^\\d]+", 
    "replacement": "" 
} 

[\\d]+匹配所有數字。根據你的描述,你想刪除除數字以外的所有東西,因此[^\\d]+