2012-01-26 2 views
5

У меня есть настройка ElasticSearch, получающая данные для индексации через реку CouchDB. У меня проблема с тем, что большинство полей в документах CouchDB фактически не имеют отношения к поиску: они являются внутренними полями приложения (идентификаторы и т. Д.), И я не хочу получать ложные срабатывания из-за этих полей. Кроме того, индексирование ненужных данных кажется мне пустой тратой ресурсов.ElasticSearch: индексируйте только поля, указанные в сопоставлении

Чтобы решить эту проблему, я определил отображение, в котором я указываю поля, которые я хочу проиндексировать. Я использую pyes для доступа к ElasticSearch. Процесс, за которым я следую, следующий:

  1. Создайте реку CouchDB, связанную с индексом. Это, по-видимому, создает также индекс и создает в этом индексе «couchdb», которое, насколько я вижу, включает все поля с динамически назначенными типами.
  2. Поместите сопоставление, переставив его в поля, которые я действительно хочу индексировать.

Это определение индекса, как получено:

curl -XGET http://localhost:9200/notes_index/_mapping?pretty=true 

{ 
    "notes_index" : { 
    "default_mapping" : { 
     "properties" : { 
     "note_text" : { 
      "type" : "string" 
     } 
     } 
    }, 
    "couchdb" : { 
     "properties" : { 
     "_rev" : { 
      "type" : "string" 
     }, 
     "created_at_date" : { 
      "format" : "dateOptionalTime", 
      "type" : "date" 
     }, 
     "note_text" : { 
      "type" : "string" 
     }, 
     "organization_id" : { 
      "type" : "long" 
     }, 
     "user_id" : { 
      "type" : "long" 
     }, 
     "created_at_time" : { 
      "type" : "long" 
     } 
     } 
    } 
    } 
} 

Проблема, что у меня есть это много раз:

  • , что «CouchDB» отображение по умолчанию индексирует все поля. Я не хочу это. Можно ли избежать создания этого сопоставления? Я смущен, потому что это сопоставление, похоже, является тем, что каким-то образом «соединяется» с рекой CouchDB.
  • отображение, что я создаю, кажется, не имеет никакого эффекта: не существует каких-либо документов, индексированные, что отображение

Есть ли у вас какие-либо рекомендации по этому вопросу?

EDIT

Это то, что я на самом деле делает, точно как прописано:

server="localhost" 

# Create the index 
curl -XPUT "$server:9200/index1" 

# Create the mapping 
curl -XPUT "$server:9200/index1/mapping1/_mapping" -d ' 
{ 
    "type1" : { 
     "properties" : { 
      "note_text" : {"type" : "string", "store" : "no"} 
     } 
    } 
} 
' 

# Configure the river 
curl -XPUT "$server:9200/_river/river1/_meta" -d '{ 
    "type" : "couchdb", 
    "couchdb" : { 
     "host" : "localhost", 
     "port" : 5984, 
     "user" : "admin", 
     "password" : "admin", 
     "db" : "notes" 
    }, 
    "index" : { 
     "index" : "index1", 
     "type" : "type1" 
    } 
}' 

Документы в INDEX1 все еще содержат, кроме «note_text» поля, которое является только один, что я конкретно упомянуты в определении отображения. Почему это?

ответ

0

Поведение CouchDB по умолчанию - использовать динамическое отображение, то есть индексировать все поля, которые находятся в входящих документах CouchDB. Вы правы, что он может излишне увеличивать размер индекса (ваши проблемы с поиском можно решить, исключив некоторые поля из запроса).

Чтобы использовать собственное отображение вместо «динамический» один, вам нужно настроить плагин River использовать отображение вы создали (см this article):

curl -XPUT 'elasticsearch-host:9200/_river/notes_index/_meta' -d '{ 
    "type" : "couchdb", 

    ... your CouchDB connection configuration ... 

    "index" : { 
     "index" : "notes_index", 
     "type" : "mapping1" 
    } 
}' 

Имя типа, вы указываете URL-адрес при выполнении сопоставления PUT переопределяет тот, который вы включаете в определение, поэтому тип, который вы создаете, фактически является mapping1. Попробуйте выполнить эту команду, чтобы увидеть для себя:

> curl 'localhost:9200/index1/_mapping?pretty=true' 

{ 
    "index1" : { 
    "mapping1" : { 
     "properties" : { 
     "note_text" : { 
      "type" : "string" 
     } 
     } 
    } 
    } 
} 

Я думаю, что если вы получите имя типа справа, он начнет работать нормально.

+0

Спасибо за ваш комментарий, но что-то неясно. Где я могу использовать мое сопоставление (я назвал его 'default_mapping') в этом запросе PUT? – dangonfast

+0

У вас есть одно сопоставление на индекс, но вы можете иметь несколько «типов», объявленных в каждом сопоставлении. Я не был уверен, какой тип отображения вы намереваетесь использовать - у вас есть два из них: 'couchdb' и' default_mapping'. Просто измените значение для ключа 'type' в конфигурации рек. –

+0

Я отредактировал исходный вопрос, показывая фактические запросы POST, которые я делаю для настройки ES. Это все еще не работает: все поля по-прежнему индексируются. – dangonfast

Смежные вопросы