[英]Lucene Sample Query
當我通過短語“ 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();
您可能要使用SpanQuery。
具體來說,您可以創建一個SpanNearQuey,向構造函數傳遞一個SpanTermQuerys數組,一個用於短語中的每個子句,一個int表示“ slope”或最大距離(以及一個布爾值,指示術語是否必須按順序排列) )。
要進行搜索,請對您創建的查詢使用getSpans方法。
請注意,這將為您提供所有此類事件的列表,而不是匹配文檔的列表。 根據您想要呈現結果的方式,您可能需要遍歷跨度並根據文檔等對它們進行分組。
我不清楚您要尋找的是什么,但我相信它是以下之一:
"field:\\"" + line + "\\""
:簡單短語查詢。 查找兩個相鄰的有序術語
"field:\\"" + line + "\\"~3"
〜3 "field:\\"" + line + "\\"~3"
:帶斜率的詞組查詢。 按順序排列,但在兩個術語中最多具有三個值得分離的術語。
"field:(" + line + ")"
:根本不是短語查詢。 簡單搜索兩個術語。 任何順序或距離都是可以接受的。
您可以在Lucene的查詢語法文檔中查看有關查詢解析器語法的更多選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.