elasticsearch 如何在ES中搜索聚合?
我有一个图书索引,其中包含一系列标签(包括文本/关键字类型),我想为标签提供一个自动完成功能,以便用户键入“ro”并返回“Roman”或“rock and roll” 以下是我的映射:
elasticsearch 如何在ES中搜索聚合?,
elasticsearch,
elasticsearch,我有一个图书索引,其中包含一系列标签(包括文本/关键字类型),我想为标签提供一个自动完成功能,以便用户键入“ro”并返回“Roman”或“rock and roll” 以下是我的映射: /books { ... tags: { type: 'text', field: { keyword: {type: 'keyword'} } } } 范例书 { name: "foo", tags: ['romance', 'story', 'fiction']
/books {
...
tags: {
type: 'text',
field: {
keyword: {type: 'keyword'}
}
}
}
范例书
{ name: "foo", tags: ['romance', 'story', 'fiction'] }
我的标签聚合:
{
size: 0,
aggregations: {
options: {
terms: {
field: `tags.keyword`,
size: 20
}
}
}
我如何才能只获取与“ro”匹配的所有不同标记?只需尝试:
GET book/_search
{
"query": {
"prefix": {
"tags.keyword": "ro"
}
}, "size": 0,
"aggs": {
"options": {
"terms": {
"field": "tags.keyword",
"size": 20
}
}
}
}
但对于您的用例,我建议您使用ngram过滤器构建一个自定义分析器,如下所示:
"tags": {
"type": "text",
"analyzer": "english_custom",
"fields": {
"suggester": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"keyword":{
"type": "keyword" }
}
{"filter":{
....
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 8
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
自动完成分析器应如下所示:
"tags": {
"type": "text",
"analyzer": "english_custom",
"fields": {
"suggester": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"keyword":{
"type": "keyword" }
}
{"filter":{
....
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 8
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
编辑:
你能在术语聚合中使用include子句吗
GET /_search
{
"aggs" : {
"tags" : {
"terms" : {
"field" : "tags.keyword",
"include" : "ro.*"
}
}
}
}
你看过热门歌曲吗?我不确定这对这个案例会有什么帮助。我希望你能根据你的搜索查询为每个标签创建热门搜索聚合。所以,你的搜索会有一个顶级标签的列表。问题是我得到的其他标签不包含“ro”,但它们只是碰巧在有其他“ro”标签的相同文档中。我们能在上面使用bucket选择器聚合吗?这只在标记与“ro”匹配的文档上应用了一个过滤器,我仍然得到没有“ro”的兄弟标记。问题是我得到的其他标记不包含“ro”,但它们恰好位于具有其他“ro”标记的相同文档中,包括工作!!但是我如何使它不区分大小写,正则表达式似乎没有像/i这样的标志?@Ryan你现在不能,你应该在索引时以小写形式插入标记,或者为具有文本数据类型的字段向分析器添加小写过滤器,或者为具有关键字datatype的字段向规范化器添加小写。谢谢你的帮助!