Ограничить результаты couchdb-lucene ключом / конкретным полем?карта? - PullRequest
3 голосов
/ 25 февраля 2011

У меня довольно простой вопрос.

Я использую couchdb-lucene для поиска в полном тексте моих документов.

Каждый из моих документов имеет следующие поля:

_id

_rev

docID (уникальный идентификатор документа из нашей системы)

заголовок (название документа)

содержание (тело документа)

userID (пользователь, которому принадлежит документ)

Мой проектный документ выглядит так:

{
   "_id": "_design/lucene",
   "_rev": "10-770b7044393e067b7024a896ccf3c502",
   "fulltext": {
       "by_all": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.title); ret.add(doc.content); return ret }"
       },
       "by_title": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.title); return ret }"
       }
   }
}

Я не мог понять, как вернуть docID как часть результатов, поэтому сейчас я просто сделал ID равным docID, но я хотел бы понять, как вернуть docID, так как проектный документ только выше возвращает счет и идентификатор документа. Я бы предпочел не устанавливать для идентификатора то же значение, что и для docID, просто для доступа к нему.

Когда я запускаю запрос, такой как:

* * +1025 локальный: 5984 / Foo / _fti / _design / Lucene / д = by_all Пример ~ 0.5f * +1026 *

Я получаю обратно коллекцию всех документов, где поле заголовка или содержимого содержит «пример», и это здорово, но как мне найти «пример» в полях заголовка и содержимого ТОЛЬКО документов, которые имеют определенный идентификатор пользователя ? Как я могу передать и использовать это значение?

Я хочу сделать что-то вроде этого:

* * Локальная тысяча тридцать один: 5984 / Foo / _fti / _design / Lucene / д = by_all Пример ~ 0.5f & = 123 идентификатор пользователь

Когда я делаю: localhost: 5984 / foo / _fti / _design / lucene / by_all? Q = пример ~ 0.5f возвращает документы для всех пользователей, что мне нужно сделать, чтобы ограничить документы только теми, которые принадлежат конкретный пользователь? Я не хочу искать каждый документ из миллионов, когда только несколько тысяч имеют отношение к конкретному пользователю.

Спасибо!

p.s. Я знаю, что могу использовать карту в представлениях: "map": "function (doc) {emit (doc._id, doc._rev)}"

Это актуально? Есть ли способ использовать карту в результатах couchdb-lucene? Я не мог понять, как указать, какое значение использовать в ключе для карты, поэтому он возвращал идентификатор по умолчанию, как можно установить ключ для использования определенного поля? Может быть, карта даже не верная дорожка ... Я не знаю, что здесь делать, я очень плохо знаком с CouchDB и Lucene и пока не совсем все понимаю.

Еще раз спасибо!

1 Ответ

3 голосов
/ 21 августа 2011

Это кажется простым, но вам нужно изменить свою индексную функцию.

function(doc) {
  var ret=new Document();
  ret.add(doc.title);
  ret.add(doc.content});
  ret.add(doc.userID, {"field":"userID"});
  ret.add(doc.docID, {"field":"docID","store":"yes"});
  return ret;
}

Запрос с;

localhost:5984/foo/_fti/_design/lucene/by_all?q=example%20AND%20userID:123

Это найдет все документы с «примером» в заголовкеили содержимое, если userID равен 123. Кроме того, в результатах будет возвращено значение docID.

HTH, B.

...