gpt4 book ai didi

java - Lucene - 使用 FSDirectory 创建索引

转载 作者:搜寻专家 更新时间:2023-10-31 20:19:52 25 4
gpt4 key购买 nike

第一次发帖;长期读者。如果这里已经有人问过这个问题,我很抱歉(我也是 lucene 的新手!)。我做了很多研究,但无法为我的问题找到好的解释/示例。

首先,我使用 IKVM.NET 将 lucene 4.9 java 转换为包含在我的 .net 应用程序中。我选择这样做是为了能够使用最新版本的 lucene。没有问题。

我正在尝试创建一个基本示例来开始学习 lucene 并将其应用到我的应用程序中。我进行了无数次谷歌搜索并阅读了大量文章、apache 的网站等。我的代码主要遵循此处的示例:http://www.lucenetutorial.com/lucene-in-5-minutes.html

我的问题是,我不相信我想使用 RAMDirectory.. 对吗?因为我将索引数据库并允许用户通过网站搜索它。我选择使用 FSDirectory 是因为我认为它不应该全部存储在内存中。

创建 IndexWriter 时,它每次都会创建新文件(.cfe、.cfs、.si、segments.gen、write.lock 等)在我看来,您会创建这些文件一次,然后使用它们直到需要重建索引?

那么如何在不重新创建索引文件的情况下创建一个 IndexWriter 呢?

代码:

StandardAnalyzer analyzer;
Directory directory;
protected void Page_Load(object sender, EventArgs e)
{
var version = org.apache.lucene.util.Version.LUCENE_CURRENT;
analyzer = new StandardAnalyzer(version);

if(directory == null){ directory= FSDirectory.open(new java.io.File(HttpContext.Current.Request.PhysicalApplicationPath + "/indexes"));
}

IndexWriterConfig config = new IndexWriterConfig(version, analyzer);

//i found setting the open mode will overwrite the files but still creates new each time
config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);

IndexWriter w = new IndexWriter(directory, config);
addDoc(w, "test", "1234");
addDoc(w, "test1", "1234");
addDoc(w, "test2", "1234");
addDoc(w, "test3", "1234");
w.close();

}


private static void addDoc(IndexWriter w, String _keyword, String _keywordid)
{
Document doc = new Document();
doc.add(new TextField("Keyword", _keyword, Field.Store.YES));
doc.add(new StringField("KeywordID", _keywordid, Field.Store.YES));
w.addDocument(doc);
}

protected void searchButton_Click(object sender, EventArgs e)
{
String querystr = "";
String results="";


querystr = searchTextBox.Text.ToString();

Query q = new QueryParser(org.apache.lucene.util.Version.LUCENE_4_0, "Keyword", analyzer).parse(querystr);

int hitsPerPage = 100;
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);

TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

if (hits.Length == 0)
{
label.Text = "Nothing was found.";
}
else
{
for (int i = 0; i < hits.Length; ++i)
{
int docID = hits[i].doc;
Document d = searcher.doc(docID);

results += "<br />" + (i + 1) + ". " + d.get("KeywordID") + "\t" + d.get("Keyword") + " Hit Score: " + hits[i].score.ToString() + "<br />";

}
label.Text = results;
reader.close();
}
}

最佳答案

是的,RAMDirectory 非常适合快速、实时测试和教程,但在生产中,您通常希望通过以下方式将索引存储在文件系统上一个 FSDirectory

每次打开编写器时都会重写索引的原因是您将 OpenMode 设置为 IndexWriterConfig.OpenMode.CREATECREATE 表示您要删除该位置的任何现有索引,并从头开始。你可能想要 IndexWriterConfig.OpenMode.CREATE_OR_APPEND , 如果找到一个现有索引,它将打开一个现有索引。


一个小提示:

您不应使用 LUCENE_CURRENT(已弃用),而应使用真实版本。您还在 QueryParser 中使用了 LUCENE_4_0。这些都可能不会导致任何重大问题,但无论如何保持一致是件好事。

关于java - Lucene - 使用 FSDirectory 创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25296748/

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