#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). если на этом шаге не существует простого способа генерировать новые поля, я не могу сделать это по-вашему.