Найти все доступные значения для поля в lucene .net - PullRequest
3 голосов
/ 07 сентября 2011

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

Пример xдоступные устанавливаемые значения = test1, test2, test3, test4

Элемент 1: Поле x = test1

Элемент 2: Поле x = test2

Элемент 3: Поле x = test4

Элемент 4: Поле x = test1

Выполнение требуемого запроса вернет список: test1, test2, test4

Ответы [ 5 ]

6 голосов
/ 07 сентября 2011

Я реализовал это раньше как метод расширения:

public static class ReaderExtentions
{
    public static IEnumerable<string> UniqueTermsFromField(
                                          this IndexReader reader, string field)
    {
        var termEnum = reader.Terms(new Term(field));

        do
        {
            var currentTerm = termEnum.Term();

            if (currentTerm.Field() != field)
                yield break;

            yield return currentTerm.Text();
        } while (termEnum.Next());
    }
}

Вы можете использовать его очень легко, как это:

var allPossibleTermsForField = reader.UniqueTermsFromField("FieldName");

Это вернет вам то, что вы хотите.

РЕДАКТИРОВАТЬ: я пропустил первый срок выше, из-за некоторой рассеянности. Я обновил код для правильной работы.

1 голос
/ 07 сентября 2011
TermEnum te = indexReader.Terms(new Term("fieldx"));
do
{
    Term t = te.Term();
    if (t==null || t.Field() != "fieldx") break;
    Console.WriteLine(t.Text());
} while (te.Next());
1 голос
/ 07 сентября 2011

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

Просто задайте в запросе следующие свойства:

facet=true
facet.field=fieldname
facet.limit=N //the number of values you want to retrieve
0 голосов
/ 21 октября 2014

Однажды я использовал Lucene 2.9.2, и там я использовал подход с FieldCache, описанный Мэннингом в книге "Lucene in Action":

String[] fieldValues = FieldCache.DEFAULT.getStrings(indexReader, fieldname);

Массив fieldValues содержит все значения в индексе для поля fieldname (Пример: ["NY", "NY", "NY", "SF"]), так что теперь вам решать, как обрабатывать массив. Обычно вы создаете HashMap<String,Integer>, который суммирует вхождения каждого возможного значения, в данном случае NY = 3, SF = 1.

Может быть, это помогает. Он довольно медленный и занимает много памяти для очень больших индексов (1.000.000 документов в индексе), но работает.

0 голосов
/ 07 сентября 2011

Я думаю, что поиск с помощью WildcardQuery по полю 'x' и значению '*' поможет.

...