如何防止Facet术语进行标记化

jmn*_*ong 10 tokenize elasticsearch

我正在使用Facet Terms获取字段的所有唯一值及其计数.而且我得到了错误的结果.

term: web 
Count: 1191979 
term: misc 
Count: 1191979 
term: passwd 
Count: 1191979 
term: etc 
Count: 1191979 
Run Code Online (Sandbox Code Playgroud)

而实际结果应该是:

term: WEB-MISC /etc/passwd 
Count: 1191979 
Run Code Online (Sandbox Code Playgroud)

这是我的示例查询:

{
  "facets": {
    "terms1": {
      "terms": {
        "field": "message"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

imo*_*tov 15

如果重新索引是一个选项,那么最好更改映射并将此字段标记为not_analyzed

"your_field" : { "type": "string", "index" : "not_analyzed" }
Run Code Online (Sandbox Code Playgroud)

如果需要保留分析的字段版本,则可以使用多字段类型:

"your_field" : {
  "type" : "multi_field",
    "fields" : {
      "your_field" : {"type" : "string", "index" : "analyzed"},
      "untouched" : {"type" : "string", "index" : "not_analyzed"}
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以继续使用your_field查询,同时使用facet搜索your_field.untouched.

或者,如果存储了此字段,则可以使用脚本字段facet:

"facets" : {
  "term" : {
    "terms" : {
      "script_field" : "_fields.your_field.value"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

作为最后的手段,如果没有存储此字段,但记录源存储在索引中,您可以尝试这样做:

"facets" : {
  "term" : {
    "terms" : {
      "script_field" : "_source.your_field"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

第一种解决方案是最有效的.最后一个解决方案效率最低,可能会在大型索引上花费大量时间.