弹性搜索:与分析器的匹配查询不起作用

Elastic search : Match query with analyzer is not working

My goal is to search a word irrespective of the analyzer added to that.

我使用 匹配 查询和 关键字分析器 但我认为它适用于添加到 属性 的默认分析器。

在elasticsearch中,我的作者文档结构是这样的

"_source": {
               "Id": 3,
               "Organization": "let123"
            }

索引映射:

 createIndexDescriptor.NumberOfReplicas(1)
                .NumberOfShards(1)
                .Settings(
                    settings =>
                    settings
                        .Add("analysis.filter.autocomplete_filter_ngram.type", "edge_ngram")
                        .Add("analysis.filter.autocomplete_filter_ngram.min_gram", "2")
                        .Add("analysis.filter.autocomplete_filter_ngram.max_gram", "7")
                        .Add("analysis.analyzer.title_analyzer.type", "custom")
                        .Add("analysis.analyzer.title_analyzer.char_filter.0", "html_strip")
                        .Add("analysis.analyzer.title_analyzer.tokenizer", "standard")
                        .Add("analysis.analyzer.title_analyzer.filter.0", "lowercase")
                        .Add("analysis.analyzer.title_analyzer.filter.1", "asciifolding")
                        .Add("analysis.analyzer.title_analyzer.filter.2", "autocomplete_filter_ngram"))
                .AddMapping<Author>(
                    m =>
                    m.MapFromAttributes()
                        .AllField(f => f.Enabled(true))
                        .Properties(
                            props =>
                            props.MultiField(
                                mf =>
                                mf.Name(t => t.Organization)
                                    .Fields(fs => fs.String(s => s.Name(t => t.Organization).Analyzer("title_analyzer"))
                                          ))));

here i noted one of my title analyzer filter is ngram

但是我在我的匹配查询中使用了关键字分析器以避免在我的搜索中自动完成。

GET /author/_search {
    "query": {
        "match": {
           "Organization": {
               "query": "le",
               "analyzer": "keyword"
           }
        }
    } }

但是当我搜索时,上面的文档是匹配的。 我期望的是 Organization 的确切值为 'le'

为什么这样匹配?有实现我目标的想法吗?

通过在查询中指定分析器,您可以指示 Elasticsearch 如何分析您发送的查询。

例如:

GET /author/_search
  {
    "query": {
        "match": {
           "Organization": {
               "query": "le",
               "analyzer": "keyword"
           }
        }
     }
  }

告诉 Elasticsearch 在 le 字符串上使用 keyword 分析器。它不会影响已在您存储的数据上创建的索引词 (let123)

改变存储数据分析方式的唯一方法是更新映射并重新索引数据。

多字段

不可能对同一个字段使用多个分析器,但数据可以轻松地存储在多个字段中(每个字段都有一个分析器)。

例如:

{
  "tweet" : {
    "properties" : {
      "name" : {
        "type" : "string",
        "index" : "analyzed",
        "fields" : {
          "raw" : {"type" : "string", "index" : "not_analyzed"}
        }
      }
    }
  }
}

名称数据自动存储在两个位置 - 在字段 name(分析的地方)和 name.raw(不进行分析的地方)。参见 Multi Fields

GET /author/_search 
{
    "query": {
        "term": "le"
    }
}