доступ к списку ключевых слов из индекса Lucene - PullRequest
2 голосов
/ 17 июня 2009

Мы планируем использовать люцен в качестве FTI-сервиса.Помимо прочего, мы хотим создать индекс тега, основанный на атрибуте тега наших документов, который просто содержит разделенные пробелами теги.

Теперь для предложения дополнения тегов было бы замечательно, если бы был способ получить доступ ко всем уникальным ключевым словам данного индекса.Lucene должен быть в состоянии сделать это внутренне, так как он использует это для выполнения запросов-аналогов, чтобы переписать их, используя OR.

Есть предложения?

Ответы [ 5 ]

5 голосов
/ 17 июня 2009

Используйте IndexReader.terms , чтобы получить все значения терминов (и количество документов) для поля тегов.

1 голос
/ 27 июня 2009

Вам нужно сделать две вещи:

1) Когда вы создаете документ для индексации, убедитесь, что вы используете «ANALYZED»

doc.add(new Field("tags", tags, Field.Store.NO, Field.Index.ANALYZED));

2) Используйте логический запрос и ИЛИ все термины:

BooleanQuery query = new BooleanQuery();

for( String tag : tags){
    query.add(new TermQuery("tags", tag), BooleanClause.Occur.SHOULD); 
}
TopDocs docs = searcher.search(query, null, searchLimit);
1 голос
/ 18 июня 2009

Будьте внимательны при использовании терминов из индекса напрямую. Если при индексации у вас включен стемминг, все смешные строки начнут появляться в списке терминов. «Красота» сводится к «красоте», «создание» превращается в «создание» и так далее.

1 голос
/ 17 июня 2009

Завершение тега должно происходить либо из (a) запроса префикса в вашем списке тегов (например, pytho *), либо (b) через запрос к полю, помеченному ngram (например, Lucene будет индексировать python как p , py, pyt, pytho, python в отдельном поле.) Оба эти решения позволяют выполнять запросы на завершение тегов на лету.

То, что вы предлагаете (и какой ответ получит Coady), - это более автономный подход или то, что вы не хотите запускать во время запроса. Это также хорошо - словари тегов не должны находиться в режиме реального времени, но имейте в виду, что перебор терминов IndexReader не должен быть операцией «времени запроса».

0 голосов
/ 17 июня 2009

Если вы пытаетесь выполнить завершение тега, вам не нужны все уникальные теги, вам нужны теги, которые соответствуют тому, что пользователь уже ввел. Это может быть сделано с использованием подстановочного, нечеткого, span или proefix запроса в зависимости от необходимости.

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