ElasticSearch search_analyzer已应用,但未返回任何结果

卡马羽

我有一个查询,应该搜索小写字母。

实际上,我只是拥有一个带有小写过滤器index_analyzer,但我还想添加一个search_analyzer以便进行不区分大小写的搜索。

"analysis": {
    "analyzer" : {
        "DefaultAnalyzer": {
            "type": "custom",
            "tokenizer": "whitespace",
            "filter": [
                "lowercase"
            ],
            "char_filter": ["punctuation"]
        },
        "MyAnalyzer": {
            "type": "custom",
            "tokenizer": "first_letter",
            "filter": [
                "lowercase"
            ]
        },

所以我只是想将与search_analyzer相同的分析器添加到映射中

"index_analyzer": "DefaultAnalyzer",
"search_analyzer": "DefaultAnalyzer",
"dynamic" : false,
"_source": { "enabled": true },
"properties" : {
    "name": {
        "type": "multi_field",
        "fields": {
            "name": {
                "type": "string",
                "store": true
            },
            "startletter": {
                "type": "string",
                "index_analyzer": "MyAnalyzer",
                "search_analyzer": "MyAnalyzer",
                "store": true
            }
        }
    },

这样做,如果我手动查询Elastic Search

curl -XGET host:9200/my-index/_analyze -d 'Test'

我看到查询词正确地小写

{
  "tokens": [
    {
      "token": "test",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

但是从代码执行

  • 如果我使用大写搜索词,则ES返回零命中(即使我们看到应用search_analyzer
  • 如果我使用小写的搜索字词,则ES会向我返回正确的结果命中数(百个)

尽管我希望独立于案件获得相同的结果。

在代码中,我只是使用术语过滤器创建查询,就像这样

{
  "filter": {
    "term": {
      "name.startletter": "O"
    }
  },
  "size": 10000,
  "query": {
    "match_all": {}
  }
}

我做错了什么?为什么我没有得到任何结果?

约翰·彼得罗恩

问题是您正在使用术语过滤器。术语过滤器不会分析正在使用的文本:

字词过滤器

筛选具有包含术语(未分析)的字段的文档。与术语查询类似,不同之处在于它充当过滤器。

http://www.elasticsearch.org/guide/zh-CN/elasticsearch/reference/current/query-dsl-term-filter.html

由于它不会分析,因此不会使用您定义的分析器。

您通常希望对未分析的字段使用术语过滤器和查询。将您的过滤器类型更改为将在查询期间进行分析的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章