10

我正在使用 Facet 术语来获取字段的所有唯一值及其计数。我得到了错误的结果。

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"
      }
    }
  }
}
4

3 回答 3

15

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

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

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

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

这样,您可以继续your_field在查询中使用,同时使用your_field.untouched.

或者,如果存储了此字段,您可以使用脚本字段方面来代替:

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

万不得已,如果不存储该字段,但记录源存储在索引中,您可以尝试以下操作:

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

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

于 2012-04-10T17:57:41.877 回答
0

哇,我今天在最近的弹性搜索中进行术语聚合时也遇到了同样的问题。在谷歌搜索和一些部分理解之后,发现了这个令人讨厌的索引是如何工作的(这很简单)。

查询只能找到倒排索引中实际存在的词条

当您索引以下字符串时

"WEB-MISC /etc/passwd"

它将被传递给分析器。分析器可能会将其标记为

"WEB", "MISC", "etc" and "passwd" 

及其位置详细信息。并且此标记可能会过滤为小写,例如

"web", "misc", "etc" and "passwd"

所以,索引后,搜索查询只能看到以上4个。不是完整的单词“WEB-MISC /etc/passwd”。根据您的要求,以下是我可以使用的选项

1.Change the Default Analyzer used by elasticsearch([link][1])
2.If it is not need, just TurnOff the analyzer by setting 'not_analyzed' for the fields you need
3.To convert the already indexed data searchable, re-indexing is the only option
于 2016-01-06T15:32:25.420 回答
-1

我已经简要解释了这个问题,并在这里提出了两个解决方案。我在这里讨论了多种方法。一种是使用 not_analyzed 来保留字符串。但是由于它具有不区分大小写的缺点,因此更好的方法是使用关键字标记器+小写过滤器

于 2015-10-09T10:35:44.593 回答