gpt4 book ai didi

java - 为什么 Lucene 不返回全词匹配的结果?

转载 作者:行者123 更新时间:2023-11-29 09:11:00 25 4
gpt4 key购买 nike

我正在使用 Lucene 将关键字与应用程序中的单词列表相匹配。整个过程是自动化的,无需任何人工干预。从 Lucene 返回的结果列表中选择最匹配的结果(最高分的那个)。

以下代码演示了上述功能,结果打印在控制台上。

问题:

问题是lucene搜索关键字(要搜索的词),结果给出了部分匹配关键字的词。另一方面,完全匹配的结果也存在,并没有排在第一位。

例如,如果我有包含单词“测试”和“测试工程师”的 lucene RAM 索引。如果我想在索引中搜索“AB4_Test Eng_AA0XY11”,那么结果将是

测试
测试工程师

尽管“AB4_Test Eng_AA0XY11”中的 Eng 与 Engineer 匹配(这就是它列在结果中的原因)。但它没有获得最高位置。我想优化我的解决方案以将“测试工程师”置于首位,因为它是考虑整个关键字的最佳匹配。谁能帮我解决这个问题?

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);
}
}

最佳答案

你可以看看Lucene Query syntax rules查看如何强制搜索 测试工程师

基本上,使用诸如

之类的查询
 AB4_Test AND Eng_AA0XY11

可以工作,但我不确定。上面链接指向的页面非常简洁,您将能够快速找到满足您需求的查询。

关于java - 为什么 Lucene 不返回全词匹配的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12493545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com