【问题标题】:ElasticSearch - searching different doc_types with the same field name but different analyzersElasticSearch - 搜索具有相同字段名称但不同分析器的不同 doc_types
【发布时间】:2015-02-15 11:34:22
【问题描述】:

假设我做了一个简单的 ElasticSearch 索引:

curl -XPUT 'http://localhost:9200/test/' -d '{
    "settings": {
        "analysis": {
            "char_filter": {
                "de_acronym": {
                    "type": "mapping",
                    "mappings": [".=>"]
                }
            },
            "analyzer": {
                "analyzer1": {
                    "type":      "custom",
                    "tokenizer": "keyword",
                    "char_filter": ["de_acronym"]
                }
            }
        }
    }
}'

我创建了两个具有相同属性 name 的 doc_type,但它们的分析方式略有不同:

curl -XPUT 'http://localhost:9200/test/_mapping/docA' -d '{
    "docA": {
        "properties": {
            "name": {
                "type": "string",
                "analyzer": "simple"
            }
        }
    }
}'
curl -XPUT 'http://localhost:9200/test/_mapping/docB' -d '{
    "docB": {
        "properties": {
            "name": {
                "type": "string",
                "analyzer": "analyzer1"
            }
        }
    }
}'

接下来,假设我在每个 doc_type 中放置了一个同名的文档:

curl -XPUT 'http://localhost:9200/test/docA/1' -d '{ "name" : "U.S. Army" }'
curl -XPUT 'http://localhost:9200/test/docB/1' -d '{ "name" : "U.S. Army" }'

让我们尝试在两种文档类型中同时搜索“U.S. Army”:

curl -XGET 'http://localhost:9200/test/_search?pretty' -d '{
    "query": {
        "match_phrase": {
            "name": {
                "query": "U.S. Army"
            }
        }
    }
}'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.5,
    "hits" : [ {
      "_index" : "test",
      "_type" : "docA",
      "_id" : "1",
      "_score" : 1.5,
      "_source":{ "name" : "U.S. Army" }
    } ]
  }
}

我只得到一个结果!当我指定 docB 的分析器时,我得到了另一个结果:

curl -XGET 'http://localhost:9200/test/_search?pretty' -d '
{
    "query": {
        "match_phrase": {
            "name": {
                "query": "U.S. Army",
                "analyzer": "analyzer1"
            }
        }
    }
}'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "test",
      "_type" : "docB",
      "_id" : "1",
      "_score" : 1.0,
      "_source":{ "name" : "U.S. Army" }
    } ]
  }
}

我的印象是 ES 会使用适当的分析器搜索每个 doc_type。有没有办法做到这一点?

ElasticSearch 文档说 precedence for search analyzer 去:

1) 查询本身定义的分析器,否则

2) 字段映射中定义的分析器,否则 ...

在这种情况下,ElasticSearch 是不是随意选择使用哪个字段映射?

【问题讨论】:

    标签: elasticsearch lucene search-engine analyzer


    【解决方案1】:

    看一下github中的this issue,它似乎是从this ES google groups 中的帖子开始的。我相信它回答了你的问题:

    如果它在过滤的查询中,我们无法推断它,所以我们只需选择其中一个并使用它的分析设置

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      相关资源
      最近更新 更多