Расширение синонимов Lucene, определение, проверка орфографии и многое другое - PullRequest
1 голос
/ 14 августа 2011

Я использую Lucene для индексации своей базы данных, а затем выполняю поиск фразы по определенному полю (имя поля: ключевое слово).В настоящее время я использую следующий код:

        String userQuery = request.getParameter("query");
        //create standard analyzer object
        analyzer = new StandardAnalyzer(Version.LUCENE_30);
                    Analyzer analyze=AnalyzerUtil.getPorterStemmerAnalyzer(analyzer);
        //create File object of our index directory
        File file = new File(LUCENE_INDEX_DIRECTORY);
        //create index reader object
        reader = IndexReader.open(FSDirectory.open(file),true);
        //create index searcher object
        searcher = new IndexSearcher(reader);
        //create topscore document collector
        collector = TopScoreDocCollector.create(1000, false);
        //create query parser object
        parser = new QueryParser(Version.LUCENE_30,"keyword", analyze);
                    parser.setAllowLeadingWildcard(true);
        //parse the query and get reference to Query object
        query = parser.parse(userQuery);
        //********Line 1***********************
                    //search the query
        searcher.search(query, collector);
        hits = collector.topDocs().scoreDocs;
        //check whether the search returns any result
        if(hits.length>0){//Code to retrieve hits}

Этот код отлично работает для определения границ, но теперь я хочу также расширить свой запрос, чтобы выполнить поиск по синонимам, например, если я ввожу "Man", а в моем индексе Lucene есть запись"мужчина", он все еще мог бы дать мне это как хит.Я пытался добавить это в строке 1 в приведенном выше коде query=SynExpand.expand(userQuery,<br> searcher, analyze,"keyword",serialVersionUID); Но это не дает мне никакого результата.Я также хочу ввести проверку орфографии, где, если я введу «невероятно» вместо «невероятно», это все равно даст мне результат.

Я понятия не имею, почему расширение синонима не работает для меня и каксделать проверку орфографии. Пожалуйста, если кто-то может направить меня, я буду очень благодарен.

Спасибо!

1 Ответ

4 голосов
/ 14 августа 2011

Нечеткий поиск может быть выполнен с помощью модификатора ключевого слова запроса, а именно путем добавления тильды:

keyword:ubelievable~

См. Синтаксис Lucene Parser для более подробной информации и других типов запросов, которые могут быть вам интересны.

Есть 2 способа обращения с синонимами. Расширение запроса , которое вы пытаетесь использовать, зависит от WordNet . Как сказано в документации SynExpand, вы должны сначала вызвать Syns2Index , чтобы использовать расширение. Это простой способ, но он работает только с английскими словами.

Если вам нужно добавить поддержку нескольких языков или добавить свои собственные синонимы, вы можете использовать внедрение синонимов во время индексации. Идея состоит в том, чтобы написать свой собственный анализатор, который будет вставлять синонимы из вашего собственного словаря в проиндексированные документы. Это может показаться сложным для реализации, но, к счастью, в книге Lucene in Action есть отличный пример (исходный код доступен бесплатно, см. Пакет lia.analysis.synonym. Однако я настоятельно рекомендую получить вашу копию этой замечательной книги ).

...