Храня реляционные данные в индексе Lucene.NET

Многое из него зависит от вида работы, которую я делаю. Я использую мерзавец или svn на в значительной степени всем, что я пишу в эти дни. Github поднимал планку для простоты сотрудничества и обычно что я ожидаю от репозитория SCM. TextMate всегда пригождается для отрывков, regex находят и заменяют, и все виды небольших тонкостей редактирования; для большинства проектов это - мой основной текстовый редактор. Для Java я потрачу хороший бит времени в Eclipse, и назад когда я был, сделал работу.NET, которую я буду использовать Visual Studio. Если я поцарапаю вместе дизайн прототипа для веб-сайта, я буду использовать Коду или что-то подобное.

при подсчете библиотек и платформ как "средства разработки", regexes Ruby берет пирог для простоты использования. Haskell Парсек победы для того, чтобы сделать серьезный парсинг, сопровождаемый очень тесно Java ANTLR. Шумиха быть проклятым, я должен все же быть как продуктивная запись веб-приложения, чем я с Ruby on Rails , хотя Опоры на земле Python хороши. Аналогично с Visual Studio для того, чтобы сделать клиентскую работу GUI, хотя я думаю Какао + , XCode в Leopard мог быть очень конкурентоспособным, если я когда-нибудь получаю хорошее схватывание на Objective C. IR LLVM является новым блоком, если Вы пишете компилятор.

6
задан fyjham 19 November 2009 в 02:44
поделиться

1 ответ

У меня были проблемы с хранением реляционных данных i Lucene, но тот, который у вас есть, должно быть легко исправить.

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

Пожалуйста, проверьте следующий небольшой фрагмент кода:

internal class Program {
    private static void Main(string[] args) {
        var directory = new RAMDirectory();
        var writer = new IndexWriter(directory, new StandardAnalyzer());
        AddDocument(writer, "group", "stuff", Field.Index.UN_TOKENIZED);
        AddDocument(writer, "group", "other stuff", Field.Index.UN_TOKENIZED);
        writer.Close(true);

        var searcher = new IndexSearcher(directory);
        Hits hits = searcher.Search(new TermQuery(new Term("group", "stuff")));

        for (int i = 0; i < hits.Length(); i++) {
            Console.WriteLine(hits.Doc(i).GetField("group").StringValue());
        }
    }

    private static void AddDocument(IndexWriter writer, string name, string value, Field.Index index) {
        var document = new Document();
        document.Add(new Field(name, value, Field.Store.YES, index));
        writer.AddDocument(document);
    }
}

Образец добавляет в индекс два документа, которые не были идентифицированы, выполняет поиск материала и получает одно обращение. Если вы изменили код, чтобы добавить их в токенизированные, то у вас будет два совпадения, как вы видите сейчас.

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

Другой пример, иллюстрирующий поведение:

    private static void Main(string[] args) {
        var directory = new RAMDirectory();
        var writer = new IndexWriter(directory, new StandardAnalyzer());

        var documentA = new Document();
        documentA.Add(new Field("name", "A", Field.Store.YES, Field.Index.UN_TOKENIZED));
        documentA.Add(new Field("group", "stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
        documentA.Add(new Field("group", "other stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
        writer.AddDocument(documentA);
        var documentB = new Document();
        documentB.Add(new Field("name", "B", Field.Store.YES, Field.Index.UN_TOKENIZED));
        documentB.Add(new Field("group", "stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
        writer.AddDocument(documentB);
        var documentC = new Document();
        documentC.Add(new Field("name", "C", Field.Store.YES, Field.Index.UN_TOKENIZED));
        documentC.Add(new Field("group", "other stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
        writer.AddDocument(documentC);

        writer.Close(true);

        var query1 = new TermQuery(new Term("group", "stuff"));
        SearchAndDisplay("First sample", directory, query1);

        var query2 = new TermQuery(new Term("group", "other stuff"));
        SearchAndDisplay("Second sample", directory, query2);

        var query3 = new BooleanQuery();
        query3.Add(new TermQuery(new Term("group", "stuff")), BooleanClause.Occur.MUST);
        query3.Add(new TermQuery(new Term("group", "other stuff")), BooleanClause.Occur.MUST);
        SearchAndDisplay("Third sample", directory, query3);
    }

    private static void SearchAndDisplay(string title, Directory directory, Query query3) {
        var searcher = new IndexSearcher(directory);
        Hits hits = searcher.Search(query3);
        Console.WriteLine(title);
        for (int i = 0; i < hits.Length(); i++) {
            Console.WriteLine(hits.Doc(i).GetField("name").StringValue());
        }
    }
5
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: