当我用短语“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。
P.S我使用标准的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();
答案 0 :(得分:1)
您可能想要使用SpanQuery。
具体来说,您可以创建一个SpanNearQuey,向构造函数传递一个SpanTermQuerys数组,一个用于短语中的每个子句,一个int表示“slop”,或最大距离(以及一个布尔值,指示这些术语是否必须按顺序。)
要搜索,请对您创建的查询使用getSpans方法。
请注意,这将为您提供所有此类事件的列表,而不是匹配文档的列表。根据您希望如何呈现结果,您可能需要迭代跨度并根据文档等对它们进行分组。
答案 1 :(得分:1)
我不清楚你究竟在寻找什么,但我相信它是以下之一:
"field:\"" + line + "\""
:简单的词组查询。找到两个相邻的有序术语
"field:\"" + line + "\"~3"
:使用slop进行短语查询。按顺序,但在两个术语中最多有三个术语的分离。
"field:(" + line + ")"
:根本不是短语查询。简单搜索这两个术语。任何订单或距离都可以接受。
您可以在Lucene的query syntax documentation
中查看有关查询解析器语法的更多选项