Я только начинаю с 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
версию.
Оба поля проиндексированы и токенизированы, с (я думаю) одним и тем же токенизатором / анализатором (я также пробовал другие), и ни одно из них не сохраняется, поэтомумоя интуиция заключается в том, что они должны вести себя одинаково.Чего мне не хватает?