#java #lucene
#java #lucene
Вопрос:
Я использую Apache lucene для поиска строки в файле . Какой синтаксический анализ использует lucene. Если я ищу obama, он не возвращает результаты с помощью Presobama, в то время как возвращает результаты для #Obama. Кто-нибудь может сказать мне, почему? Я использую текстовое поле.
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
// Code to create the index
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer);
IndexWriter w = new IndexWriter(index, config);
addDoc(w, finalstep);
w.close();
String querystr = search;
// The "title" arg specifies the default field to use when no field is explicitly specified in the query
Query q = new QueryParser(Version.LUCENE_44, "title", analyzer).parse(querystr);
// Searching code
int hitsPerPage = 10;
IndexReader reader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
Ответ №1:
Анализатор определяет, как текст разделяется на токены. Вы используете StandardAnalyzer
.
StandardAnalyzer
пытался разделить поток на слова, как правило. Правила, которые он использует для этого, полностью указаны в стандартном приложении Unicode № 29, но, говоря очень грубо: он разделяет токены пробелами и пунктуацией.
Этот «#Obama» становится «obama». «#» будет удален при анализе. «Presobama» станет «presobama». Представленные правила синтаксического анализа ничего не знают о термине «presobama» и не имеют оснований для вывода, что его следует рассматривать как более одного слова.
Существует несколько подходов к получению более слабого соответствия. Несколько возможностей: вы можете использовать подстановочные запросы, использовать NGramTokenFilter для индексации ngrams токенов, или, если у вас просто есть несколько таких сложных терминов, вы можете указать замены синонимов с помощью SynonymFilter .