当未存储索引字段时,是否可以找到匹配的单词的位置?
Query: "fox over dog"
Indexed text of matched doc: "The quick brown fox jumps over the lazy dog"
What I want: [4,6,9]
Note1 :我知道文字可以使用Lucene突出显示,但我想要单词的位置
Note2 :该字段未设置为由Lucene存储**
答案 0 :(得分:0)
我还没有出于实际目的这样做 - 只是为了给出一个伪代码和指针,你可以试验它以达到正确的解决方案。
另外,您还没有指定Lucene版本,我使用Lucene 6.0.0和Java。
1.在编制索引时,将这两个布尔值设置为您需要的位置的特定字段。如果索引存储了该信息,Lucene将能够提供该数据。
FieldType txtFieldType = new FieldType(
TextField.TYPE_NOT_STORED);
txtFieldType.setStoreTermVectors(true);
txtFieldType.setStoreTermVectorPositions(true);
2.在您的搜索者中,您需要使用Terms
,TermsEnum
& PostingsEnum
如下所示,
`Terms terms = searcher.getIndexReader().getTermVector(hit.doc, "TEXT_FIELD");`
if(terms.hasPositions()){
TermsEnum termsEnum = terms.iterator();
PostingsEnum postings = null;
while(termsEnum.next() != null){
postings = termsEnum.postings(postings ,PostingsEnum.ALL);
while(postings.nextDoc() != PostingsEnum.NO_MORE_DOCS){
System.out.println(postings.nextPosition());
}
您需要进行一些自己的分析,以获得所需的数据,但首先需要保存元数据,如第1点所示。
}
}
searcher
是IndexSearcher实例,hit.doc
是doc id,hit是ScoreDoc
。