ElasticSearch - поиск разных doc_types с одинаковым именем поля, но разными анализаторами

Допустим, я делаю простой индекс 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"]
                }
            }
        }
    }
}'

И я создаю два doc_types, которые имеют одно и то же свойство name, но анализируются немного по-другому:

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" }'

Попробуем найти "Армия США" одновременно в обоих типах документов:

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 говорится, что приоритет для поискового анализатора идет:

1) Анализатор, определенный в самом запросе, иначе

2) Анализатор, определенный в отображении поля, иначе ...

В этом случае, выбирает ли ElasticSearch произвольно, какое отображение поля использовать?


person Temuz    schedule 17.12.2014    source источник


Ответы (1)


Взгляните на эту проблему в github, которая, похоже, началась с это сообщение в группах Google ES. Я считаю, что это ответ на ваш вопрос:

если он находится в отфильтрованном запросе, мы не можем вывести его, поэтому мы просто выбираем один из них и используем его настройки анализа

person Andrei Stefan    schedule 17.12.2014