gpt4 book ai didi

java - Lucene搜索保存文件内容时不返回结果

转载 作者:行者123 更新时间:2023-11-30 04:28:07 25 4
gpt4 key购买 nike

我正在尝试使用apache lucene开发一个日志查询系统。我开发了一个演示代码来索引两个文件,然后搜索查询字符串。

第一个文件包含数据麦克林

第二个文件包含数据平托

波纹管是我用于索引的代码

 fis = new FileInputStream(file);
DataInputStream in = new DataInputStream(fis);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
Document doc = new Document();

Document doc = new Document();
doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8"))));

doc.add(new StoredField("filename", file.getCanonicalPath()));

if (indexWriter.getConfig().getOpenMode() == OpenMode.CREATE) {

System.out.println("adding " + file);
indexWriter.addDocument(doc);
} else {

System.out.println("updating " + file);
indexWriter.updateDocument(new Term("path", file.getPath()), doc);
}

如果我使用此代码,那么我会得到提供者结果。但在显示中我只能显示文件名,因为我只存储了文件名。

所以我修改了代码并使用此代码存储了文件内容

        FileInputStream fis = null;
if (file.isHidden() || file.isDirectory() || !file.canRead() || !file.exists()) {
return;
}
if (suffix!=null && !file.getName().endsWith(suffix)) {
return;
}
System.out.println("Indexing file " + file.getCanonicalPath());

try {
fis = new FileInputStream(file);
} catch (FileNotFoundException fnfe) {
System.out.println("File Not Found"+fnfe);

}
DataInputStream in = new DataInputStream(fis);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
String Data="";
while ((strLine = br.readLine()) != null)
{
Data=Data+strLine;
}

Document doc = new Document();
doc.add(new TextField("contents", Data, Field.Store.YES));
doc.add(new StoredField("filename", file.getCanonicalPath()));

if (indexWriter.getConfig().getOpenMode() == OpenMode.CREATE) {

System.out.println("adding " + file);
indexWriter.addDocument(doc);
} else {

System.out.println("updating " + file);
indexWriter.updateDocument(new Term("path", file.getPath()), doc);
}

根据我的理解,我应该得到的结果数为1。并且它应该显示包含maclean的文件的文件名和内容

但我得到的结果是

------------------------结果------------------------ ---

共有 0 个匹配文档找到 0 条

我在代码中做错了什么,或者对此有一个合乎逻辑的解释吗?为什么第一个代码有效而第二个代码无效?

搜索查询代码

 try
{
Directory directory = FSDirectory.open(indexDir);
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_41);

QueryParser parser = new QueryParser(Version.LUCENE_41, "contents", analyzer);
Query query = parser.parse(queryStr);
System.out.println("Searching for: " + query.toString("contents"));
TopDocs results = searcher.search(query, maxHits);

ScoreDoc[] hits = results.scoreDocs;
int numTotalHits = results.totalHits;

System.out.println("\n\n\n-----------------------Results--------------------------\n\n\n");
System.out.println(numTotalHits + " total matching documents");


for (int i = 0; i < numTotalHits; i++) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);

System.out.println(i+":File name is: "+d.get("filename"));
System.out.println(i+":File content is: "+d.get("contents"));



}
System.out.println("Found " + numTotalHits);
}
catch(Exception e)
{
System.out.println("Exception Was caused in SimpleSearcher");
e.printStackTrace();

}

最佳答案

使用 StoredField 代替 TextField

doc.add(new StoredField("Data",Line));

当您使用文本字段时,字符串会被标记化,因此您将无法搜索相同的内容。存储字段存储整个字符串而不对其进行标记。

关于java - Lucene搜索保存文件内容时不返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15334133/

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