Использование эластичного поиска для запроса внутри массивов в CouchDB

#php #rest #lucene #couchdb #elasticsearch

#php #остальное #lucene #couchdb #эластичный поиск

Вопрос:

Моя база данных CouchDB структурирована следующим образом:

 "custom_details": {
  "user_education": [
    {
      "device_id": "358328030246627",
      "college_name": "College",
      "college_year": "2014"
    },
  ]
}

"custom_details_1": {
  "user_education": [
    {
      "device_id": "358328030246627",
      "college_name": "College",
      "college_year": "2014"
    },
  ]
}
  

У меня много массивов внутри массивов. Что я пытаюсь сделать, используйте Elasticsearch для поиска терминов, независимо от того, где он находится в массиве. Возможно ли это?

Я просматривал примеры, приведенные здесь, и не совсем нашел то, что искал. Я пытался использовать Elastica, PHP-оболочку, но, не до конца понимая, как это сделать с помощью REST, я заблудился. Возможно ли вообще выполнять поиск данных, не зная поля?

Ответ №1:

В Lucene вы могли бы создать экземпляр документа для каждого идентификатора устройства:

 public void indexRecord(CouchDBRecord rec) {
    Document doc = new Document();
    doc.add(new Field("device_id", rec.device_id, Store.YES, Index.NOT_ANALYZED));
    doc.add(new Field("college_name",  rec.college_name, Store.YES, Index.ANALYZED));
    doc.add(new Field("college_year", rec.college_year.toString(), Store.YES, Index.NOT_ANALYZED));
    this.writer.addDocument(doc);
}
  

Это позволит вам осуществлять поиск по ключевым словам в названии колледжа, или по точному идентификатору устройства, или по году выпуска, или по некоторой их комбинации.

Ответ №2:

Если вы используете Elastica, все ОСТАЛЬНОЕ уже сделано за вас. Если вы хотите выполнять поиск по всем полям, вы можете определить только термин поиска, и он будет выполнять поиск по всем полям.

Если у вас возникли какие-то проблемы с Elastica или отсутствуют какие-то функции, которые вам нужны, дайте мне знать, поскольку я разработчик Elastica.

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

1. привет, Николас Руфлин, я работаю над эластичным поиском с couchdb. у меня небольшая путаница, как я могу управлять индексом для нескольких пользователей одновременно.

2. для одного пользователя одновременно это работало отлично, но когда я попробовал это для нескольких пользователей одновременно, у него появилось предупреждение (org.apache.commons.httpclient. ПРЕДУПРЕЖДЕНИЕ SimpleHttpConnectionManager getConnectionWithTimeout: SimpleHttpConnectionManager используется неправильно. Убедитесь, что HttpMethod. releaseConnection() вызывается всегда, и только один поток и / или метод использует этот диспетчер соединений одновременно.)