Поиск полей TokenStream в Lucene - PullRequest
4 голосов
/ 01 марта 2011

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

Я не могу понять, Luceneвозвращать результаты для полей, которые инициализированы TokenStream, тогда как поля, инициализированные string, работают нормально.Я использую Lucene.NET 2.9.2 RC2.

[Редактировать] Я также пробовал это с последней версией Java (3.0.3) и вижу то же поведение, так что это не какой-то странный изport.

Вот базовый пример:

Directory index = new RAMDirectory();
Document doc = new Document();
doc.Add(new Field("fieldName", new StandardTokenizer(new StringReader("Field Value Goes Here"))));
IndexWriter iw = new IndexWriter(index, new StandardAnalyzer());
iw.AddDocument(doc);
iw.Commit();
iw.Close();
Query q = new QueryParser("fieldName", new StandardAnalyzer()).Parse("value");
IndexSearcher searcher = new IndexSearcher(index, true);
Console.WriteLine(searcher.Search(q).Length());

(я понимаю, что это использует API, устаревшие с 2.9, но это только для краткости ... притворяются, что аргументы, которые указывают версию, естьи я использую один из новых Search s).

Это не возвращает результатов.

Однако, если я заменю строку, которая добавляет поле, на

doc.Add(new Field("fieldName", "Field Value Goes Here", Field.Store.NO, Field.Index.ANALYZED));

тогда запрос возвращает совпадение, как я и ожидал.Это также работает, если я использую TextReader версию.

Оба поля проиндексированы и токенизированы, с (я думаю) одним и тем же токенизатором / анализатором (я также пробовал другие), и ни одно из них не сохраняется, поэтомумоя интуиция заключается в том, что они должны вести себя одинаково.Чего мне не хватает?

1 Ответ

1 голос
/ 01 марта 2011

Я обнаружил, что ответ заключен в оболочку.

Поток токенов, созданный StandardAnalyzer, имеет LowerCaseFilter, а при создании StandardTokenizer такой фильтр не применяется напрямую.

...