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