Автозаполнение / автозаполнение с несколькими индексами и Lucene.Net? - PullRequest
1 голос
/ 17 мая 2011

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

Обновление: я нашел эту ссылку . Возможно, именно так мне и нужно подходить к решению.

1 Ответ

1 голос
/ 22 мая 2011

Вы можете использовать MultiReader для чтения от нескольких читателей. Вот пример для перебора всех проиндексированных терминов в поле с именем «data». Вы указываете, где вы хотите начать перечисление в вызове .Terms(...). Вы можете указать другую начальную точку, чтобы соответствовать введенной пользователем информации, чтобы обеспечить автозаполнение на уровне термина.

using System;
using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Store;

public static class ConsoleApp {
    private static readonly String FieldName = "data";

    public static void Main() {
        var ram1 = Create(prefix: "b");
        var ram2 = Create(prefix: "a");

        var multiReader = new MultiReader(new[] {
            IndexReader.Open(ram1, readOnly: true),
            IndexReader.Open(ram2, readOnly: true)
        });

        var termsEnum = multiReader.Terms(new Term(FieldName));
        do {
            var term = termsEnum.Term();
            if (term.Field() != FieldName)
                break;

            Console.WriteLine(term.Text());
        } while (termsEnum.Next());
    }

    public static Directory Create(String prefix) {
        var dir = new RAMDirectory();

        var writer = new IndexWriter(dir, a: new KeywordAnalyzer(), create: true, mfl: IndexWriter.MaxFieldLength.UNLIMITED);
        for (var i = 0; i < 5; ++i) {
            var doc = new Document();
            doc.Add(new Field(FieldName, prefix + i, Field.Store.NO, Field.Index.NOT_ANALYZED));
            writer.AddDocument(doc);
        }
        writer.Close();

        return dir;
    }
}
...