我在使用弹性搜索中的数据实现自动完成功能时遇到问题..我的文档目前有这种结构
PUT mainindex/books/1
{
"title": "The unread book",
"author": "Mario smith",
"tags": [ "Comedy", "Romantic" , "Romantic Comedy","México"]
}
所有字段都已编入索引,tags
的映射为lowercase,asciifolding
过滤器..
现在所需的功能是,如果用户输入mario smith rom
...,我需要从rom
开始提取标签,但仅适用于mario smith
的图书。这需要将文本分成组件..我已经得到了那个部分..当前的查询是这样的......
{
"query": {
"query_string": {
"query": "mario smith",
"default_operator": "AND"
}
},
"size": 0,
"aggs": {
"autocomplete": {
"terms": {
"field": "suggest",
"order": {
"_term": "asc"
},
"include": {
"pattern": "rom.*"
}
}
}
}
}
并返回预期结果,用户应根据查询键入的单词列表..以及他开始输入的单词的前缀..
{
"aggregations" : {
"autocomplete" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "romantic comedy",
"doc_count" : 4
},
{
"key" : "romantic",
"doc_count" : 2
}
]
}
}
}
现在的问题是我无法向用户提供这些单词,因为它们是小写的,没有重音词liker México
被编入索引,如mexico
..并且用我的语言使一些单词看起来像很奇怪..如果我从tag
字段中删除过滤器,则值会正确保存到索引中。但模式rom.*
将不匹配,因为用户键入了不同的案例,可能无法使用正确的重音符号。
一般而言,需要的是采用一组过滤的文档..聚合它们的标签,以自然格式返回它们。但过滤掉那些没有相同前缀的标签。以案例/重音方式过滤它们。
PS:我看到一些关于有两个版本的字段的建议,一个分析和一个原始...但似乎无法过滤一个并返回另一个..有没有人有想法,如何执行此查询或实现此功能?