1

当我按短语“ph1 ph2”搜索时,它会找到包含“ph1”或“ph2”的文本。

String line = "ph1 ph2";           
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, analyzer);
Query query = parser.parse(line);  

任何人都知道如何通过 1) 短语(“ph1 ph2”)进行搜索。示例:这是句子 ph1 ph2。2)具有最大距离的短语(“ph1 ph2 ~3”)。示例 这个 ph1 是句子 ph2。

PS 我使用标准的 Lucene Indexer 来索引我的文件。如果这个例子不清楚查看http://www.lucenetutorial.com/lucene-query-syntax.html

这是完整的代码:

String index = "C:/programs/lucenedemo/index";
    String field = "contents";                    
    IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index)));
    IndexSearcher searcher = new IndexSearcher(reader);
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
    //QueryParser parser = new QueryParser(Version.LUCENE_40, field, analyzer);          
    String line = "ph1 ph2";           
    QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, analyzer);
    Query query = parser.parse(line);                     
    //doPagingSearch(searcher, query, hitsPerPage, raw, queries == null && queryString == null);         
    //doPagingSearch

    TopDocs results = searcher.search(query, 300000);
    ScoreDoc[] hits = results.scoreDocs;        
    System.out.println(results.totalHits);

    for (int i=0;i<10;i++) {    
    Document doc = searcher.doc(hits[i].doc);
        String path = doc.get("path");
        if (path != null) System.out.println((i+1) + ". " + path);                          
    } 

    //end of doPagingSearch
    reader.close();
4

2 回答 2

1

您可能想要使用 SpanQuery。

具体来说,您可以创建一个 SpanNearQuey,向构造函数传递一个 SpanTermQuerys 数组,一个用于短语中的每个子句,以及一个表示“slop”或最大距离的 int(以及一个指示术语是否必须按顺序排列的布尔值) )。

要进行搜索,请对您创建的查询使用 getSpans 方法。

请注意,这将为您提供所有此类事件的列表,而不是匹配文档的列表。根据您希望如何呈现结果,您可能需要遍历跨度并根据文档等对它们进行分组。

于 2013-08-19T14:05:42.600 回答
1

我不清楚您到底在寻找什么,但我相信它是其中之一:

  • "field:\"" + line + "\"": 简单的词组查询。找到两个相邻的有序项

  • "field:\"" + line + "\"~3": 带有 slop 的短语查询。按顺序排列,但在两个术语中最多可分离三个术语。

  • "field:(" + line + ")": 根本不是短语查询。简单搜索这两个词。任何顺序或距离都是可以接受的。

您可以在 Lucene 的查询语法文档中查看有关查询解析器语法的更多选项

于 2013-08-19T16:41:35.740 回答