java - TermQuery 没有给出预期结果作为 QueryParser - Lucene 7.4.0

标签 java indexing lucene

我正在使用 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;

        int numTotalHits = Math.toIntExact(results.totalHits);
        System.out.println(numTotalHits + " total matching documents");

        for(int i=0;i<numTotalHits;i++)
        {
             Document doc = searcher.doc(hits[i].doc);
             String path = doc.get("path");
             String content = doc.get("ashish");
             System.out.println(path+"\n"+content);

        }



    } 

上面的代码演示了如何使用QueryParser来检索所需的字段,可以正常工作。它会命中所有 10 个文档,因为我正在为所有 10 个文档存储此字段。这里一切都好。 Screenshot depicting search hits

但是,当我使用 TermQuery API 时,我没有得到想要的结果。 我正在展示我对 TermQuery 所做的代码更改。

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: " + q.toString());

        TopDocs results = searcher.search(q, 5 * hitsPerPage);
        ScoreDoc[] hits = results.scoreDocs;

        int numTotalHits = Math.toIntExact(results.totalHits);
        System.out.println(numTotalHits + " total matching documents");

        for(int i=0;i<numTotalHits;i++)
        {
             Document doc = searcher.doc(hits[i].doc);
             String path = doc.get("path");
             String content = doc.get("ashish");
             System.out.println(path+"\n"+content);
             System.out.println("----------------------------------------------------------------------------------");
        }



    }

还附上 TermQuery API 执行的屏幕截图。 TermQuery API Usage

对 stackoverflow 本身的例子做了一些研究 Lucene TermQuery and QueryParser但没有找到任何实际的解决方案,而且这些示例中的 lucene 版本也很旧。

非常感谢您的帮助。

提前致谢!

最佳答案

我在这篇文章中得到了问题的答案 link that explains how TermQuery works

TermQuery 按原样搜索整个字符串。这种行为会给您带来不正确的结果,因为索引数据通常是标记化的。

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

谢谢, 阿什什

关于java - TermQuery 没有给出预期结果作为 QueryParser - Lucene 7.4.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51336488/

相关文章:

java - 在 Lucene 中,如何确定 IndexSearcher 或 IndexWriter 是否正在另一个线程中使用?

sql - 为什么这个索引会使 SELECT GROUP BY 查询变慢?

database - 关于非关系数据库(NoSQL)的问题

c# - 将类型转换为类

java - 如何对数据库中作为二进制数据存储的文件进行索引?

java - spring - 直接从@RequestParams填充@ModelAttributes

c# - 将 1,2,3,4,5,6,8,10,11 显示为 1-6,8,10-11

java.net.SocketException : Broken pipe while accessing mysql on cloud server

java - 创建相差 1 个字符的单词图

java - 从大文件中查找词频