为了账号安全,请及时绑定邮箱和手机立即绑定

TermQuery没有提供预期的结果作为QueryParser-Lucene 7.4.0

TermQuery没有提供预期的结果作为QueryParser-Lucene 7.4.0

墨色风雨 2021-05-07 15:19:16
我正在使用StandardAnalyser索引10个文本文档。public static void indexDoc(final IndexWriter writer, Path filePath, long timstamp)    {        try (InputStream iStream = Files.newInputStream(filePath))        {            Document doc = new Document();            Field pathField = new StringField("path",filePath.toString(),Field.Store.YES);            Field flagField = new TextField("ashish","i am stored",Field.Store.YES);            LongPoint last_modi = new LongPoint("last_modified",timstamp);            Field content = new TextField("content",new BufferedReader(new InputStreamReader(iStream,StandardCharsets.UTF_8)));            doc.add(pathField);            doc.add(last_modi);            doc.add(content);            doc.add(flagField);            if(writer.getConfig().getOpenMode()==OpenMode.CREATE)            {                System.out.println("Adding "+filePath.toString());                writer.addDocument(doc);            }        } catch (IOException e) {            e.printStackTrace();        }    } 上面是用于索引文档的代码段。为了进行测试,我正在搜索一个名为“ ashish”的字段。当我使用QueryParser时,Lucene会按预期提供搜索结果。public static void main(String[] args) throws Exception    {        String index = "E:\\Lucene\\Index";        String field = "ashish";        int hitsPerPage = 10;        IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));        IndexSearcher searcher = new IndexSearcher(reader);        Analyzer analyzer = new StandardAnalyzer();        QueryParser parser = new QueryParser(field, analyzer);        String line = "i am stored";        Query query = parser.parse(line);      //  Query q = new TermQuery(new Term("ashish","i am stored"));        System.out.println("Searching for: " + query.toString());        TopDocs results = searcher.search(query, 5 * hitsPerPage);        ScoreDoc[] hits = results.scoreDocs;上面的代码演示了如何使用QueryParser检索所需的字段,该字段正常工作。它命中了所有10个文档,因为我正在为所有10个文档存储此字段。这里一切都很好。
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

我在这个帖子链接中得到了我问题的答案,该 链接解释了TermQuery的工作方式

TermQuery照原样搜索整个String。当索引数据经常被标记化时,此行为将给您不正确的结果。

在发布的代码中,我正在将整个搜索字符串传递给TermQuery,例如
查询q = new TermQuery(new Term(“ ashish”,“我已存储”));
现在在上述情况下,Lucene会按原样查找“我已存储”,这是永远不会找到的,因为在索引中此字符串已被标记化。
相反,我尝试像查询q一样搜索q = new TermQuery(new Term(“ ashish”,“ stored”));
上面的查询给了我预期的结果。

谢谢,Ashish


查看完整回答
反对 回复 2021-05-26
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

真正的问题是您的查询字符串在这里没有得到分析。因此,请使用与索引文档时所用的分析器相同的分析器,并尝试使用以下代码分析查询字符串然后进行搜索。


IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));

IndexSearcher searcher = new IndexSearcher(reader);


QueryParser parser = new QueryParser("ashish", analyzer);

Query query = new TermQuery(new Term("ashish", "i am stored"));

query = parser.parse(query.toString());

ScoreDoc[] hits = searcher.search(query, 5).scoreDocs;


查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 304 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信