ElasticSearch返回分析的聚合的非分析版本

时间:2017-05-19 11:52:09

标签: elasticsearch autocomplete aggregate

我在使用弹性搜索中的数据实现自动完成功能时遇到问题..我的文档目前有这种结构

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:我看到一些关于有两个版本的字段的建议,一个分析和一个原始...但似乎无法过滤一个并返回另一个..

有没有人有想法,如何执行此查询或实现此功能?

0 个答案:

没有答案