Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Можно ли добавить пользовательские метаданные в поле Lucene?

Автор вопроса: devios1Ответов: 2

Я дошел до того, что мне нужно хранить некоторые дополнительные данные о том, откуда берется конкретное поле в моем индексе Lucene.Net. В частности, я хочу прикрепить руководство к определенным полям документа, когда поле добавляется в документ, и получить его снова, когда я получу документ из результатов поиска.

Это возможно?

Изменить: Хорошо, позвольте мне немного пояснить, приведя пример.

Допустим, у меня есть объект, который я хочу разрешить пользователю помечать пользовательскими тегами, такими как "личный", "любимый", "какой-то проект". Я делаю это, добавляя в документ несколько полей "тег", например:

doc.Add( new Field( "tag", "personal" ) );
doc.Add( new Field( "tag", "favorite" ) );

Проблема в том, что теперь мне нужно записать некоторые метаданные о каждом отдельном теге, в частности, guid, представляющий, откуда взялся этот тег (представьте, что это идентификатор пользователя). У каждого тега потенциально может быть другой guid, поэтому я не могу просто создать поле "tag-guid" (если порядок значений не будет сохранен - см. редактирование 2 ниже). Мне не нужно, чтобы эти метаданные индексировались (и на самом деле я бы предпочел, чтобы этого не было, чтобы избежать попаданий в метаданные), мне просто нужно иметь возможность снова получить их из документа/поля.

doc.GetFields( "tag" )[0].Metadata...

(Здесь я придумываю синтаксис, но надеюсь, что теперь моя точка зрения ясна.)

Редактировать 2: Поскольку это совершенно другой вопрос, я опубликовал новый вопрос для этого подхода: Является ли порядок многозначных полей в Lucene стабильным?

Хорошо, давайте попробуем другой подход... Ключевой проблемной областью является неопределенность значений нескольких полей под одним и тем же именем поля (например, "тег"). Если бы я мог ввести или получить какую-то определенность здесь, я мог бы хранить метаданные в другом поле.

Например, если бы я мог полагаться на то, что порядок значений поля никогда не изменится, я мог бы использовать индекс в наборе значений, чтобы точно определить, на какой тег я ссылаюсь.

Есть ли какая-либо гарантия, что порядок добавления значений в поле останется прежним, когда я извлеку документ позже?

  • не могли бы вы просто добавить его в свой документ: document.Add(new Field(GUID, guidvalue, Field.Store.YES, Field.Index.NO)); Prescott 09.02.2011
  • @Prescott проблема в том, что я добавляю несколько значений для одного и того же поля (например, тега), и мне нужно отслеживать определенную информацию о происхождении для каждого тега, поэтому у меня нет возможности просто добавить новое поле для его отслеживания, потому что я могу не идентифицируют их однозначно. devios1 09.02.2011
  • @chaiguy У меня возникли проблемы с полным пониманием того, что вы имеете в виду - не могли бы вы привести очень простой пример? Prescott 09.02.2011
  • @chaiguy Прескотт прав, вы можете добавить несколько полей в документ только для хранения - это обычная практика. Sergey Mirvoda 09.02.2011
  • пытаюсь уточнить здесь: Предположим, следующее определение документа {DocId, Text, Author, CreatedDate}. Вы говорите, что хотели бы также добавить дополнительные данные в отдельные поля. В этом случае предположим, что вы хотите пометить автора с помощью GUID, поэтому добавьте новое поле AuthorGUID для этого документа? Prescott 09.02.2011
  • @chaiguy - Просто любопытно, как вы используете добавление метаданных в метаданные? Интуитивно я бы не подумал о тегах отдельных полей, но документ в целом Prescott 09.02.2011

metadatalucene

Ответы

Ответ 1 · рейтинг 3 · misteraidan

Это может быть возможно в зависимости от ваших требований к поиску для этого индекса. Таким образом, вы можете контролировать порядок полей. Это потребует обновления обоих полей по мере изменения списка тегов, но накладные расходы могут того стоить.

doc.Add(new Field("tags", "{personal}|{favorite}"));
doc.Add(new Field("tagsref", "{1234}|{12345}"));

Примечание. Использование {} позволяет квалифицировать ваш поиск на уникальность там, где существуют похожие значения.

Пример: если бы значения были сохранены как "person|personal|personage", поиск "person" вернул бы документ, в котором есть любой из person, personal или personage. Указав в фигурных скобках, например: "{person}|{personal}|{personage}", я могу искать "{person}" и быть уверенным, что он не даст ложных срабатываний. Конечно, это предполагает, что вы не используете фигурные скобки в своих значениях.

Ответ 2 · рейтинг 2 · Xodarap

Я думаю, вы спрашиваете о полезных нагрузках. .

Изменить: судя по вашему варианту использования, у вас нет желания использовать эти метаданные в своем поиске, вы просто хотите, чтобы они были там. (По сути, вы хотите использовать Lucene в качестве системы базы данных.)

Итак, почему вы не можете использовать бинарное поле?

ExtraData ed = new ExtraData { Tag = "tag", Type = "personal" };
byte[] byteData = BinaryFormatter.Serialize(ed); // this isn't the correct code, but you get the point
doc.Add(new Field("myData", byteData, Field.Store.YES));

Затем вы можете десериализовать его при извлечении.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы