在Lucene获得比赛的位置

时间:2017-05-21 18:20:32

标签: lucene

当未存储索引字段时,是否可以找到匹配的单词的位置?

例如:

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存储**

1 个答案:

答案 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.在您的搜索者中,您需要使用TermsTermsEnum& 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