elasticsearch: особое поведение поля _id?

#mongodb #elasticsearch #n-gram #elasticsearch-mongo-river

#mongodb #elasticsearch #n-грамм #elasticsearch-река монго

Вопрос:

У меня есть некоторые данные Twitter, с которыми я хочу поработать. Я хочу иметь возможность выполнять поиск по имени. При попытке сгенерировать ngrams из ‘name’ и ‘_id’ я сталкиваюсь с некоторыми проблемами.

сначала я создал анализаторы:

 curl -XPUT 'localhost:9200/twitter_users' -d '
{
    "settings": {
        "analysis": {
            "analyzer": {
                "str_search_analyzer": {
                    "tokenizer": "keyword",
                    "filter": [
                        "lowercase"
                    ]
                },
                "str_index_analyzer": {
                    "tokenizer": "keyword",
                    "filter": [
                        "lowercase",
                        "ngram"
                    ]
                }
            },
            "filter": {
                "ngram": {
                    "type": "ngram",
                    "min_gram": 3,
                    "max_gram": 20
                }
            }
        }
    }
}'
  

затем я определил свои сопоставления:

 curl -XPUT 'http://localhost:9200/twitter_users/users/_mapping' -d '
{
    "users": {
        "type" : "object",
        "properties": {
            "_id": {
                "type": "string",
                "copy_to": "id"
            },
            "id": {
                "type": "string",
                "search_analyzer": "str_search_analyzer",
                "index_analyzer": "str_index_analyzer",
                "index": "analyzed"
            },
            "name": {
                "type": "multi_field",
                "fields": {
                    "name": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "ngrams": {
                        "type": "string",
                        "search_analyzer": "str_search_analyzer",
                        "index_analyzer": "str_index_analyzer",
                        "index": "analyzed"
                    }
                }
            }
        }
    }
}'
  

и вставил некоторые тестовые данные:

 curl -XPUT "localhost:9200/twitter_users/users/johndoe" -d '{
    "_id" : "johndoe",
    "name" : "John Doe"
}'

curl -XPUT "localhost:9200/twitter_users/users/janedoe" -d '{
    "_id" : "janedoe",
    "name" : "Jane Doe"
}'
  

запрос по имени дает мне ожидаемые результаты:

 curl -XPOST "http://localhost:9200/twitter_users/users/_search" -d '{
    "query": {
        "match": {
            "name.ngrams": "doe"
        }
    }
}'
  

но запрос к идентификатору не дает мне никаких результатов:

 curl -XPOST "http://localhost:9200/twitter_users/users/_search" -d '{
    "query": {
        "match": {
            "id": "doe"
        }
    }
}'
  

Я также протестировал, чтобы сделать _id мультиполем, как я сделал с name. Но это тоже не сработало.

ведет ли себя _id иначе, чем другие поля? Или я делаю здесь что-то не так?

редактировать: используя elasticsearch версии v1.1.2 и извлекая данные из mongodb с помощью плагина river.

Спасибо за вашу помощь

Mirko

Комментарии:

1. Здесь у меня такая же проблема.. пытаюсь добавить анализатор в поле _id. Вам когда-нибудь удавалось решить эту проблему?

2. _id поле больше не настраивается в elasticsearch, проверьте это

Ответ №1:

Похоже, проблема в ‘copy_to’, но почему бы не вставить значения ‘id’ непосредственно в поля ‘id’?

 curl -XPUT "localhost:9200/twitter_users/users/johndoe" -d '{
    "id" : "johndoe",
    "name" : "John Doe"
}'

curl -XPUT "localhost:9200/twitter_users/users/janedoe" -d '{
    "id" : "janedoe",
    "name" : "Jane Doe"
}'
  

Комментарии:

1. Хорошо, я должен был сказать, что я использую river-плагин для извлечения данных (в данном случае из mongodb). если на этом шаге не существует простого способа генерировать новые поля, я не могу сделать это по-вашему.