Точный поиск фразы с использованием Lucene?

Я использую SpanTerm Query для поиска точной фразы в lucene. Но он, похоже, не работает. Вот мой код.

индексирование

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), false,IndexWriter.MaxFieldLength.UNLIMITED); doc.add(new Field("contents", sb.toString(), Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS)); doc.add(new Field("imageid", imageDocument.getImageId(), Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("title", imageDocument.getTitle(), Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("country", imageDocument.getCountry(), Field.Store.YES, Field.Index.NOT_ANALYZED)); write.addDocument(doc); 

поиск

 String sentence = searchParameters.get("searchExactWord"); String[] words = sentence.split(" "); String queryNoWord = ""; int i = 0; SpanTermQuery [] clause = new SpanTermQuery[words.length]; for (String word : words) { clause[i] = new SpanTermQuery(new Term("contents",word)); i++; } SpanNearQuery query = new SpanNearQuery(clause, 0, true); booleanQuery.add(query, BooleanClause.Occur.MUST); 

Пожалуйста, направляйте меня, если я делаю это неправильно ???

Prateek

PhraseQuery этого попробуйте использовать PhraseQuery :

 PhraseQuery query = new PhraseQuery(); String[] words = sentence.split(" "); for (String word : words) { query.add(new Term("contents", word)); } booleanQuery.add(query, BooleanClause.Occur.MUST); 

Редактировать: Я думаю, у вас другая проблема. Какие еще части есть для вашего booleanQuery ? Вот полный рабочий пример поиска фразы:

 public class LucenePhraseQuery { public static void main(String[] args) throws Exception { // setup Lucene to use an in-memory index Directory directory = new RAMDirectory(); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); MaxFieldLength mlf = MaxFieldLength.UNLIMITED; IndexWriter writer = new IndexWriter(directory, analyzer, true, mlf); // index a few documents writer.addDocument(createDocument("1", "foo bar baz")); writer.addDocument(createDocument("2", "red green blue")); writer.addDocument(createDocument("3", "test foo bar test")); writer.close(); // search for documents that have "foo bar" in them String sentence = "foo bar"; IndexSearcher searcher = new IndexSearcher(directory); PhraseQuery query = new PhraseQuery(); String[] words = sentence.split(" "); for (String word : words) { query.add(new Term("contents", word)); } // display search results TopDocs topDocs = searcher.search(query, 10); for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document doc = searcher.doc(scoreDoc.doc); System.out.println(doc); } } private static Document createDocument(String id, String content) { Document doc = new Document(); doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED)); doc.add(new Field("contents", content, Store.YES, Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); return doc; } } 

Используйте Lucene Query Builder и дайте двойные кавычки вокруг строки поиска. Он работает для точного поиска фразы.

Ссылка: http://www.lucenetutorial.com/lucene-query-builder.html

Для версии 4.6.0 Индексирование:

 IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_46,analyzer); try { IndexWriter iwriter=new IndexWriter(mDir,config); iwriter.deleteAll(); iwriter.commit(); Document doc = new Document(); doc.add(new Field(myfieldname,text,TextField.TYPE_STORED)); iwriter.addDocument(doc); iwriter.close(); } 

Поиск точной фразы (заданной в ключевом слове переменной):

 DirectoryReader ireader=DirectoryReader.open(mDir); IndexSearcher isearcher=new IndexSearcher(ireader); QueryParser parser = new QueryParser(Version.LUCENE_46,myfieldname,analyzer); parser.setDefaultOperator(QueryParser.Operator.AND); parser.setPhraseSlop(0); Query query=parser.createPhraseQuery(myfieldname,keyword); ScoreDoc[] hits=isearcher.search(query, null, 1000).scoreDocs; nret=hits.length; ireader.close(); 

Примечание для использования «setPhraseSlop (0) и createPhraseQuery ()

  • Какие из лучших альтернатив Люцене?
  • Получите самые высокие частоты из индекса Lucene
  • Как управлять индексированием поля в lucene 4.0
  • Функция «Вы имели в виду?» В Lucene.net
  • Interesting Posts

    Android WebView открывается в WebView, а не в браузере по умолчанию.

    как объединить повторяющиеся строки и суммировать значения 3 столбца в excel

    Вентилятор ноутбука должен начинать и останавливаться очень часто?

    ActionBarSherlock сложена проблема стилей панели действий

    Excel уничтожает специальный символ при сохранении как CSV

    Каково использование метода расширения Enumerable.Zip в Linq?

    Истеризация streamов в управляемом компоненте JSF для запланированных задач с использованием таймера

    Как шифровать String в Java

    Поддерживает ли Internet Explorer 8 HTML 5?

    Как вы используете UrlEncode без использования System.Web?

    char! = (знак char), char! = (unsigned char)

    Разрешить пользователям создавать файлы, но не редактировать и не удалять их

    Каков правильный способ повторного выброса исключения в C #?

    Должны ли папки в решении соответствовать пространству имен?

    Разделить объекты NSData на другие объекты NSData заданного размера

    Давайте будем гением компьютера.