Можно ли добавить собственные метаданные в поле Lucene? - PullRequest
2 голосов
/ 09 февраля 2011

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

Возможно ли это?

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

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

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

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

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

(здесь я составляю синтаксис, но надеюсь, что моя точка зрения ясна сейчас.)

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

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

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 голосов
/ 09 февраля 2011

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

Редактировать: Исходя из вашего варианта использования, похоже, что у вас нет желания использовать эти метаданные в своем поиске, вы просто хотите еготам.(Как правило, вы хотите использовать 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));

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

...