Lucene을 사용하여 키워드를 응용 프로그램 내의 단어 목록과 비교합니다. 사람의 개입없이 전체 프로세스가 자동화됩니다. Lucene에서 반환 된 결과 목록에서 가장 일치하는 결과 (최고 점수와 최고 점수 중 하나)가 선택됩니다.Lucene이 전체 단어 일치를 기반으로 결과를 반환하지 않는 이유는 무엇입니까?
다음 코드는 위의 기능을 보여주고 결과는 콘솔에 인쇄됩니다.
문제점 :
문제는 루씬 키워드 (검색 할 단어)를 검색하고, 그 결과 부분적으로 키워드와 일치하는 단어를 제공한다는 것이다. 반면에 전체 일치 결과도 존재하며 첫 번째 순위에 순위가 매겨지지 않습니다.
예를 들어, 'Test'및 'Test Engineer'라는 단어가 포함 된 lucene RAM 색인이있는 경우. 내가 'AB4_Test Eng_AA0XY11'에 대한 색인을 검색 할 경우 결과가 될 것
테스트
테스트 엔지니어 영어 비록에서 'AB4_Test Eng_AA0XY11'(이 결과에 표시되는 이유는) 엔지니어에 일치. 그러나 그것은 최고의 위치를 얻지 못합니다. 전체 키워드를 고려한 최상의 일치 때문에 '테스트 엔지니어'를 맨 위로 가져 오기 위해 솔루션을 최적화하고 싶습니다. 어느 누구도이 문제를 푸는데 도움이 될 수 있습니까?
public class LuceneTest {
private static void search(Set<String> keywords) {
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
try {
// 1. create the index
Directory luceneIndex = buildLuceneIndex(analyzer);
int hitsPerPage = 5;
IndexReader reader = IndexReader.open(luceneIndex);
for(String keyword : keywords) {
// Create query string. replace all underscore, hyphen, comma, (,), {, }, . with plus sign
StringBuilder querystr = new StringBuilder(128);
String [] splitName = keyword.split("[\\-_,/(){}:. ]");
// After tokenizing also add plus sign between each camel case word.
for (String token : splitName) {
querystr.append(token + "+");
}
// 3. search
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
Query q = new QueryParser(Version.LUCENE_36, "name", analyzer).parse(querystr.toString());
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
System.out.println();
System.out.println(keyword);
System.out.println("----------------------");
for (ScoreDoc scoreDoc : hits) {
Document d = searcher.doc(scoreDoc.doc);
System.out.println("Found " + d.get("id") + " : " + d.get("name"));
}
// searcher can only be closed when there
searcher.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*/
private static Directory buildLuceneIndex(Analyzer analyzer) throws CorruptIndexException, LockObtainFailedException, IOException{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "Test Engineer");
map.put(2, "Test");
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
// 1. create the index
IndexWriter w = new IndexWriter(index, config);
for (Map.Entry<Integer, String> entry : map.entrySet()) {
try {
Document doc = new Document();
doc.add(new Field("id", entry.getKey().toString(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("name", entry.getValue() , Field.Store.YES, Field.Index.ANALYZED));
w.addDocument(doc);
}catch (Exception e) {
e.printStackTrace();
}
}
w.close();
return index;
}
public static void main(String[] args) {
Set<String> list = new TreeSet<String>();
list.add("AB4_Test Eng_AA0XY11");
list.add("AB4_Test Engineer_AA0XY11");
search(list);
}
}
감사합니다. 그것은 내가 이미 읽고 밖으로 시도했지만 내 원하는 results.Can이 문제에 대한 특정 팁/팁 솔루션을 안내 할 수없는 일반적인 도움이 무엇입니까? – Wiki