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

时间:2014-08-06 13:39:02

标签: elasticsearch full-text-search mapping query-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
            }
        }
    },

这样做,如果我手动查询弹性搜索

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": {}
  }
}

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

2 个答案:

答案 0 :(得分:4)

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

  

期限过滤

     

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

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

由于它不进行分析,因此不使用已定义的分析仪。

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

答案 1 :(得分:1)

我认为,您正在使用MyAnalyzer获取索引的起始字母,您的分析器不会以这种方式工作。我进行了一些测试,最后提出了解决方案。

首先,创建索引和映射(+设置)

curl -XPUT "http://localhost:9200/t1" -d'
{
   "settings": {
      "index": {
         "analysis": {
            "analyzer": {
               "DefaultAnalyzer": {
                  "type": "custom",
                  "tokenizer": "whitespace",
                  "filter": [
                     "lowercase"
                  ]
               },
               "MyAnalyzer": {
                  "type": "custom",
                  "tokenizer": "token_letter",
                  "filter": [
                     "one_token","lowercase"
                  ]
               }
            },
            "tokenizer": {
               "token_letter": {
                  "type": "edgeNGram",
                  "min_gram": "1",
                  "max_gram": "1",
                  "token_chars": [
                     "letter",
                     "digit"
                  ]
               }
            },
            "filter": {
               "one_token": {
                  "type": "limit",
                  "max_token_count": 1
               }
            }
         }
      }
   },
   "mappings": {
      "t2": {
         "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": "simple",
                     "store": true
                  }
               }
            }
         }
      }
   }
}'

然后,现在写一个数据。

curl -XPUT "http://localhost:9200/t1/t2/1" -d'
{
    "name" :"Oliver Khan"
}'

现在,这是有趣的部分,只是一个查询和方面来查看索引的内容。

curl -XPOST "http://localhost:9200/t1/t2/_search" -d'
{
  "filter": {
    "term": {
      "name.startletter": "O"
    }
  },
  "size": 10000,
  "query": {
    "match_all": {}
  },
  "facets": {
     "tf": {
        "terms": {
           "field": "name.startletter",
           "size": 10
        }
     }
  }
}'

这给了我分析文本,作为构面输出,所以我可以检查分析仪是否正常工作。 希望这会有所帮助!!