tokenize – 如何防止Facet Terms进行标记化

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

term: web 
Count: 1191979 
term: misc 
Count: 1191979 
term: passwd 
Count: 1191979 
term: etc 
Count: 1191979 

实际结果应该是:

term: WEB-MISC /etc/passwd 
Count: 1191979 

这是我的示例查询:

{
  "facets": {
    "terms1": {
      "terms": {
        "field": "message"
      }
    }
  }
}
最佳答案
如果重新索引是一个选项,最好更改映射并将该字段标记为not_analyzed

"your_field" : { "type": "string", "index" : "not_analyzed" }

如果需要保留分析版本的字段,可以使用multi field type

"your_field" : {
  "type" : "multi_field",
    "fields" : {
      "your_field" : {"type" : "string", "index" : "analyzed"},
      "untouched" : {"type" : "string", "index" : "not_analyzed"}
  }
}

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

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

"facets" : {
  "term" : {
    "terms" : {
      "script_field" : "_fields.your_field.value"
    }
  }
}

作为最后的手段,如果此字段未存储,但记录源存储在索引中,则可以尝试以下方式:

"facets" : {
  "term" : {
    "terms" : {
      "script_field" : "_source.your_field"
    }
  }
}

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

转载注明原文:tokenize – 如何防止Facet Terms进行标记化 - 代码日志