gpt4 book ai didi

java - 我的 Lucene 搜索未返回结果

转载 作者:行者123 更新时间:2023-12-02 00:40:27 25 4
gpt4 key购买 nike

我正在学习 Lucene,这是我的第一个测试课。我正在尝试实现内存搜索并从示例中借用了一些代码。但搜索无法返回任何匹配结果。你能帮我吗?谢谢。

    package my.test;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class TestInMemorySearch {
public static void main(String[] args) {
// Construct a RAMDirectory to hold the in-memory representation of the index.
RAMDirectory idx = new RAMDirectory();

try {
// Make an writer to create the index
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42, new StandardAnalyzer(Version.LUCENE_42, CharArraySet.EMPTY_SET));
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter writer = new IndexWriter(idx, iwc);

// Add some Document objects containing quotes
writer.addDocument(createDocument("Theodore Roosevelt man", "It behooves every man to remember that the work of the "
+ "critic, is of altogether secondary importance, and that, " + "in the end, progress is accomplished by the man who does " + "things."));
writer.addDocument(createDocument("Friedrich Hayek", "The case for individual freedom rests largely on the "
+ "recognition of the inevitable and universal ignorance " + "of all of us concerning a great many of the factors on "
+ "which the achievements of our ends and welfare depend."));
writer.addDocument(createDocument("Ayn Rand", "There is nothing to take a man's freedom away from "
+ "him, save other men. To be free, a man must be free " + "of his brothers."));
writer.addDocument(createDocument("Mohandas Gandhi", "Freedom is not worth having if it does not connote " + "freedom to err."));

// Optimize and close the writer to finish building the index
writer.close();
// Build an IndexSearcher using the in-memory index
SearcherManager mgr = new SearcherManager(idx, null);

try {
Document[] hits = search(mgr, "man", 100);
for (Document doc : hits) {
String title = doc.get("title");
String content = doc.get("content");
System.out.println("Found match:[Title]" + title + ", [Content]" + content);
}

} catch (IOException e) {
e.printStackTrace();
}

} catch (IOException ioe) {
// In this example we aren't really doing an I/O, so this
// exception should never actually be thrown.
ioe.printStackTrace();
}
}

/**
* Make a Document object with an un-indexed title field and an indexed
* content field.
*/
private static Document createDocument(String title, String content) {
Document doc = new Document();
doc.add(new StringField("title", title, Field.Store.YES));
doc.add(new StringField("content", content, Field.Store.YES));

return doc;
}

private static Document[] search(SearcherManager searchManager, String searchString, int maxResults) throws IOException {
IndexSearcher searcher = null;
try {
// Build the query.
String[] tokens = searchString.split("\\s+");
BooleanQuery query = new BooleanQuery();
for (String token : tokens) {
query.add(new PrefixQuery(new Term("title", token)), BooleanClause.Occur.MUST);
query.add(new PrefixQuery(new Term("content", token)), BooleanClause.Occur.MUST);
}

searcher = searchManager.acquire();
ScoreDoc[] scoreDocs = searcher.search(query, maxResults).scoreDocs;
Document[] documents = new Document[scoreDocs.length];
for (int i = 0; i < scoreDocs.length; i++) {
documents[i] = searcher.doc(scoreDocs[i].doc);
}
return documents;
} finally {
if (searcher != null) {
searchManager.release(searcher);
}
}
}
}

最佳答案

StringField似乎是一个显而易见的选择,但这不是您想要在这里使用的。您想要TextFieldStringField 将字段表示为单个标记,本质上是关键字或标识符。 TextField 分析并标记该字段以进行全文搜索。

修复它就像在 search 方法中进行更改一样简单:

doc.add(new StringField("title", title, Field.Store.YES));
doc.add(new StringField("content", content, Field.Store.YES));

doc.add(new TextField("title", title, Field.Store.YES));
doc.add(new TextField("content", content, Field.Store.YES));

关于java - 我的 Lucene 搜索未返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216817/

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