Эквивалент copyField of Solr на ElasticSearch?

Может ли кто-нибудь сказать мне, есть ли эквивалент Solr copyField директивы на ElasticSearch?

Я знаю, что существует многополюсный тип: http://www.elasticsearch.org/guide/reference/mapping/multi-field-type.html Хорошо, когда вы хотите применить несколько анализаторов в одном поле.

Но это не совсем то же самое. Solr разрешает "объединить" несколько полей в один:

<field name="id" type="string" indexed="true" stored="true"/>
<field name="name" type="string" indexed="true" stored="true"/>
<field name="subject" type="string" indexed="true" stored="true"/>
<field name="location" type="string" indexed="true" stored="true"/>
<field name="all" type="text" indexed="true" stored="true" multiValued="true"/>
<copyField source="*" dest="all"/>

Этот плагин довольно многообещающий: https://github.com/yakaz/elasticsearch-analysis-combo

Поскольку он позволяет возвращать результаты в виде одного поля при использовании поля многозначных значений ElasticSearch. Но это все еще не совсем то же самое, потому что это не позволяет "объединить" несколько полей.


Мне нужна комбинация анализатора Combo и Solr copyField.

У меня есть модель публикации блога (поля заголовка/описания) и вы хотите скопировать название и описание в одном поле "blogContent", на котором я буду применять 2 разных анализатора.

Есть ли решение в ElasticSearch?

Ответ 1

Существует специальное поле _all, которое по умолчанию получает копию всех других полей. Вы можете управлять включением в поле _all с помощью атрибута include_in_all. Однако вы ограничены одним полем, подобным этому. Если вам нужно больше одного, вам нужно будет обработать его на стороне поиска, выполнив поиск по нескольким полям.

Также возможно реализовать функциональность, похожую на copyField, с помощью multi_field с атрибутом "path": "just_name":

curl -XPUT localhost:9200/test-idx -d '{
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 0
        }
    },
    "mappings": {
        "doc": {
            "properties": {
                "first_name": {
                    "type": "multi_field",
                    "path": "just_name",
                    "fields": {
                        "first_name": {"type": "string", "index": "analyzed"},
                        "name": {"type": "string","index": "analyzed"}
                    }
                },
                "last_name": {
                    "type": "multi_field",
                    "path": "just_name",
                    "fields": {
                        "last_name": {"type": "string", "index": "analyzed"},
                        "name": {"type": "string","index": "analyzed"}
                    }
                }
            }
        }
    }
}'
echo
curl -XPUT localhost:9200/test-idx/doc/1 -d '{
    "first_name": "Sebastien",
    "last_name": "Lorber"
}'
echo
curl -XPOST localhost:9200/test-idx/_refresh
echo
curl "localhost:9200/test-idx/doc/_search?q=name:Sebastien"
echo
curl "localhost:9200/test-idx/doc/_search?q=name:Lorber"

Ответ 2

Эластичный поиск поддерживает copyTo:

Вы можете добавить анализатор в поле, которое вы хотите скопировать.