Как выполнить поиск AND в Lucene.net, когда в поиске используется несколько слов? - PullRequest
6 голосов
/ 07 мая 2011

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

У меня есть следующий код

            .....
            // Add 2 documents
            var doc1 = new Document();
            var doc2 = new Document();

            doc1.Add(new Field("id", "doc1", Field.Store.YES, Field.Index.ANALYZED));
            doc1.Add(new Field("content", "This is my first document", Field.Store.YES, Field.Index.ANALYZED));
            doc2.Add(new Field("id", "doc2", Field.Store.YES, Field.Index.ANALYZED));
            doc2.Add(new Field("content", "The big red fox jumped", Field.Store.YES, Field.Index.ANALYZED));

            writer.AddDocument(doc1);
            writer.AddDocument(doc2);

            writer.Optimize();
            writer.Close();

            // Search for doc2
            var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
            var query = parser.Parse("big abcdefg test1234");
            var searcher = new IndexSearcher(indexDirectory, true);
            var hits = searcher.Search(query);

            Assert.AreEqual(1, hits.Length());

            var document = hits.Doc(0);

            Assert.AreEqual("doc2", document.Get("id"));
            Assert.AreEqual("The big red fox jumped", document.Get("content"));

Этот тест пройден, что меня немного смущает. Я предполагаю, что это означает, что Lucene.Net использует OR для поиска между терминами, а не AND, но я не могу найти никакой информации о том, как на самом деле выполнить поиск AND.

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

Ответы [ 2 ]

7 голосов
/ 07 мая 2011

A.Если вам требуется, чтобы все слова были в документе, но не требуется, чтобы слова были последовательными, и в указанном вами порядке:не соответствует

* the small red fox jumped

B.Если вы хотите сопоставить фразу (т. Е. Все необходимые слова; слова должны быть последовательными и в указанном порядке) вместо этого:не соответствует

* the red big fox jumped
* the big fast red fox jumped
* the small red fox jumped
2 голосов
/ 07 мая 2011

Что вы получите, когда ваш запрос будет var query = parser.Parse("+big +abcdefg +test1234"); Это должно заставить синтаксический анализатор требовать наличия всех терминов в соответствующих документах.Другая возможность состоит в том, чтобы построить запрос программно.

BooleanQuery query = new BooleanQuery();
query.add(new BooleanClause(new TermQuery(new Term("field", "big"))), Occur.MUST);
query.add(new BooleanClause(new TermQuery(new Term("field", "abcdefg"))), Occur.MUST);
query.add(new BooleanClause(new TermQuery(new Term("field", "test1234"))), Occur.MUST);
...