我有一个queryparser,我想在我的文本中找到字符串“war force”:
TextWord[0]: 2003
TextWord[1]: 09
TextWord[2]: 22T19
TextWord[3]: 01
TextWord[4]: 14Z
TextWord[5]: Book0
TextWord[6]: WEAPONRY
TextWord[7]: NATO2
TextWord[8]: Bar
TextWord[9]: WEAPONRY
TextWord[10]: State
TextWord[11]: WEAPONRY
TextWord[12]: 123
TextWord[13]: War
TextWord[14]: WORD1
TextWord[15]: Force
TextWord[16]: And
TextWord[17]: Book4
TextWord[18]: Book
TextWord[19]: WEAPONRY
TextWord[20]: Book6
TextWord[21]: Terrorist.
TextWord[22]: And
TextWord[23]: WEAPONRY
TextWord[24]: 18
TextWord[25]: 31
TextWord[26]: state
TextWord[27]: AND
当使用短语slop=1(我的意思是:“战争”一词1“力量”)时,我发现了它。
我可以找到“战争”或“武力”的位置:
DirectoryReader reader = DirectoryReader.open(this.memoryIndex);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser queryParser = new QueryParser("tags", new StandardAnalyzer());
Query query = queryParser.parse("\"War Force\"~1");
TopDocs results = searcher.search(query, 1);
for (ScoreDoc scoreDoc : results.scoreDocs) {
Fields termVs = reader.getTermVectors(scoreDoc.doc);
Terms f = termVs.terms("tags");
String searchTerm = "War".toLowerCase();
BytesRef ref = new BytesRef(searchTerm);
TermsEnum te = f.iterator();
PostingsEnum docsAndPosEnum = null;
if (te.seekExact(ref)) {
docsAndPosEnum = te.postings(docsAndPosEnum, PostingsEnum.ALL);
int nextDoc = docsAndPosEnum.nextDoc();
assert nextDoc != DocIdSetIterator.NO_MORE_DOCS;
final int fr = docsAndPosEnum.freq();
final int p = docsAndPosEnum.nextPosition();
final int o = docsAndPosEnum.startOffset();
System.out.println("Word: " + ref.utf8ToString());
System.out.println("Position: " + p + ", startOffset: " + o + " length: " + ref.length + " Freg: " + fr);
if (fr > 1) {
for (int iter = 1; iter <= fr - 1; iter++) {
System.out.println("Possition: " + docsAndPosEnum.nextPosition());
}
}
}
System.out.println("Finish");
}
但是我找不到我的查询“战争力量”之类的东西的位置。如何获取找到的查询结果的位置?
1条答案
按热度按时间z31licg01#
可能有不止一种方法可以做到这一点,但我建议使用
FastVectorHighlighter
,因为它允许您访问位置和偏移数据。索引要求
要使用这种方法,您需要确保索引数据在创建索引时使用存储术语向量数据的字段:
(如果尚未捕获术语向量,这可能会显著增加索引数据的大小。)
图书馆要求
快速矢量荧光灯是系统的一部分
lucene-highlighter
图书馆:搜索示例
假设以下查询:
我们希望这能找到答案
War WORD1 Force
根据我们的测试数据。流程的第一部分使用经典查询解析器执行标准查询执行:
这个
handleHit()
方法(如下所示)是我们使用FastVectorHighlighter
.如果只想执行高亮显示(不需要位置/偏移数据),可以使用:
但要访问我们需要的额外数据,您可以执行以下操作:
这建立了一个
FastVectorHighlighter
其中包含一个FieldPhraseList
,将由荧光灯填充。这个
getBestFragment
方法现在变为:最后我们可以使用
fieldPhraseList
要访问我们需要的数据,请执行以下操作:这个
phraseStartOffset
及phraseEndOffset
字符计数是否告诉我们整个短语在源文档中的位置:因此,在我们的例子中,这是偏移量19到34之间的字符串(偏移量0是第一个“s”左侧的位置)。
然后,对于搜索查询中的每个特定术语(“战争”和“武力”),我们可以访问它们的偏移量,以及它们的单词位置(
termPosition
). 位置0是forst单词,因此我将1添加到此索引中,以在原始文档中的位置4处显示“war”,在位置6处显示“force”:以下是完整的代码供参考: