2016-02-16 2 views
-1
package com.org.test; 

import java.io.File; 
import java.io.FileReader; 

import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.FieldType; 
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.FieldInfo.IndexOptions; 
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.queryparser.classic.QueryParser; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.search.TopDocs; 
import org.apache.lucene.search.TopScoreDocCollector; 
import org.apache.lucene.search.similarities.DefaultSimilarity; 
import org.apache.lucene.store.Directory; 
import org.apache.lucene.store.FSDirectory; 
import org.apache.lucene.util.Version; 

public class Testclass { 

    public static void main(String[] args) 
    { 
     Testclass tclass = new Testclass(); 
     tclass.searchExactWord("+water-"); 
    } 

    private void searchExactWord(String singleWord) 
    { 
     StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);   
     String dictionaryPath = "c://finaldictionary.txt"; 

     try 
     { 
      //create Index   
      File dir = new File("c://spellchecker//"); 
      Directory indexDirectory = FSDirectory.open(dir); 

      IndexWriter indexWriter = new IndexWriter(indexDirectory, new IndexWriterConfig(Version.LUCENE_40, analyzer)); 

      File dictFile = new File(dictionaryPath); 
      FileReader freader = new FileReader(dictFile); 

      Document document = new Document(); 

      FieldType fieldtype = new FieldType(); 
      fieldtype.setIndexed(true); 
      fieldtype.setOmitNorms(true); 
      fieldtype.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS); 
      fieldtype.setStored(false); 
      fieldtype.setTokenized(true); 
      fieldtype.freeze(); 

      document.add(new Field("dictionary", freader, fieldtype)); 

      indexWriter.addDocument(document); 

      indexWriter.close(); 

      //search Index 
      IndexReader reader = DirectoryReader.open(indexDirectory); 
      IndexSearcher searcher = new IndexSearcher(reader); 

      TopScoreDocCollector collector = TopScoreDocCollector.create(5, true); 

      QueryParser queryParser = new QueryParser(Version.LUCENE_40, "dictionary", analyzer);   
      Query query = queryParser.parse(singleWord.trim()); 

      searcher.search(query, collector);   
      ScoreDoc[] hits = collector.topDocs().scoreDocs;    

      for (int i = 0; i < hits.length; i++) 
      { 
       System.out.println(hits[i].score);    
      } 

      System.out.println(hits.length); 

     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

} 

Я пытаюсь найти словарь на основе поиска с использованием Lucene. Словарь находится в текстовом файле (finaldictionary). Проблема в том, что когда я пытаюсь выполнить поиск/поиск, Lucene выполняет нечеткий поиск и предоставляет только количество обращений. Есть ли способ определить, нашел ли lucene точное значение или нет
из словаря?Lucene search value

ответ

0

Это не Выполнение нечеткого поиска. Для ввода предоставленных Вами, результирующий запрос будет:

+dictionary:water 

Он не будет выполнять нечеткое соответствие, то это будет только найти документы, которые содержат термин «воду».

Если вы ожидаете найти слово «+ water-», точно, в вашем индексе, вы не используете правильный анализатор для поддержки этого. StandardAnalyzer предназначен для разделения слов, и в основном устраняет прерывание. Вы должны анализировать свое поле таким образом, чтобы поддерживать ваши требования поиска.

После того, как вы сделали это, вам нужно будет либо избежать QueryParser символов (например +, в данном случае), или не использовать вообще QueryParser, такие как:

Query query = new TermQuery(new Term("dictionary", "+water-")); 
+0

(+) и (-) используются в качестве символов подстановки или escape-символов, так что люцен должен искать только «воду», а не другие термины, такие как «waterbed», «waterlog») и т. д., если я увеличиваю значение numHits в TopScoreDocCollector, увеличиваются, что приводит к большей путанице. Любой способ подтвердить, если люцен искал точный термин «вода», – Vineet