Поиск с использованием Apache Lucene

#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 .