我正在使用ElasticSearch,我想知道我是否可以使用faceting来检索我的结果中的某些统计信息,更具体地说,我的结果中提到的最多的人。我已经有一个包含该信息的字段。但是现在,当我想用多个单词对它进行分组时,我的方面结果会按术语打破该字段中的数据。
即:如果用户搜索John,我想获得诸如
之类的数据 {
[...]
"facets" : {
"topPeople" : {
"_type" : "terms",
"missing" : 0,
"total" : 1739884,
"other" : 1705319,
"terms" : [ {
"term" : "John Smith",
"count" : 13954
}, {
"term" : "John Snow",
"count" : 1432
}, {
"term" : "John Baird",
"count" : 770
}]
}
}
相反,ElasticSearch按术语中断结果并返回如下内容:
{
[...]
"facets" : {
"topPeople" : {
"_type" : "terms",
"missing" : 0,
"total" : 1739884,
"other" : 1705319,
"terms" : [ {
"term" : "John",
"count" : 1739884
}, {
"term" : "Smith",
"count" : 13954
}, {
"term" : "Snow",
"count" : 1432
}]
}
}
我在某处读到,如果我将索引设置为不进行分析,则ElasticSearch应返回完整的单词串。但是,我仍然希望用户能够在该字段上进行搜索。我想避免重复该字段以获得未经分析的字段。有没有办法用ElasticSearch对每个字段进行分组?
我目前正在使用以下构面查询:
{
"query" : {
[...]
},
"facets" : {
"topPeople" : {
"terms" : {
"field" : "people",
"size" : 3
}
}
}
}
答案 0 :(得分:14)
你走在正确的轨道上。您需要一个未分析的索引才能执行您所要求的操作,但您无需牺牲用户在该字段上搜索的方式。这里的答案(对于版本< 1.x)是Multi Field Type。对于您的示例,您希望映射看起来像这样:
"topPeople" : {
"type" : "multi_field",
"fields" : {
"topPeople" : {"type" : "string", "index" : "analyzed"},
"raw" : {"type" : "string", "index" : "not_analyzed"}
}
}
当您进行搜索时,您可以继续搜索topPeople
,但是当您面对时,您将面临topPeople.raw
。