Простой запрос в Lucene - PullRequest
1 голос
/ 16 марта 2012

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

Например, этому значению поля «AA-883 98/67» можно сопоставить следующие подстроки «883», «98/67», «AA-883», «883 98» и т. Д.

Мне нужно объединить это с другими фильтрами при запросе Lucene. Это для Lucene.NET 2.9

1 Ответ

1 голос
/ 16 марта 2012

Вы можете использовать WildCardQuery , но если термин с подстановочным знаком начинается с символа подстановки (* или?), Он будет очень медленным, если в этом поле будет много разных терминов.

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

Для объединения с другими запросами вы можете использовать класс BooleanQuery, который позволяет объединять несколько запросоввместе.

RAMDirectory dir = new RAMDirectory();
IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer());

Document doc = new Document();
doc.Add(new Field("test", "AA-883 98/67", Field.Store.YES, Field.Index.NOT_ANALYZED));
iw.AddDocument(doc);
iw.Commit();

IndexSearcher searcher = new IndexSearcher(iw.GetReader());

WildcardQuery query = new WildcardQuery(new Term("test", "*883*"));
Hits hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

query = new WildcardQuery(new Term("test", "*98/67*"));
hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

query = new WildcardQuery(new Term("test", "*AA-883*"));
hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

query = new WildcardQuery(new Term("test", "*883 98*"));
hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

Console.ReadLine();
iw.Close();
dir.Close();
...