ElasticSearch: индексировать только поля, указанные в сопоставлении - PullRequest
6 голосов
/ 27 января 2012

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

Чтобы решить эту проблему, я определил отображение, в котором я указываю поля, которые я хочу индексировать.Я использую 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.
  • создается впечатление, что создаваемое мной отображение не имеет никакого эффекта: нет документов, проиндексированных этим отображением

У вас есть какой-нибудь совет по этому поводу?

РЕДАКТИРОВАТЬ

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

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», который является only , который я специально упомянул в определении отображения.Почему это так?

1 Ответ

0 голосов
/ 27 января 2012

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

Чтобы использовать собственное отображение вместо «динамического»,вам необходимо настроить плагин River для использования созданного вами сопоставления (см. эту статью ):

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

    ... your CouchDB connection configuration ...

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...