【问题标题】:Lucene suggest: "is not a SuggestField" exception when using a CompletionQueryLucene 建议:使用 CompletionQuery 时出现“不是 SuggestField”异常
【发布时间】:2021-05-05 10:07:09
【问题描述】:

我正在尝试为我的应用实施搜索建议。实际上我需要一种“多词前缀查询”,我试图使用 PrefixCompletionQuery。问题是从 SuggestIndexSearcher 对象调用“搜索”或“建议”方法时会引发 IllegalArgumentException。

我写了一个示例代码来重现这个问题:

public static void main(String[] args) throws IOException {
    RAMDirectory dir = new RAMDirectory(); //just for this experiment
    Analyzer analyzer = new CompletionAnalyzer(new StandardAnalyzer());
    IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(analyzer));
    
    
    var doc = new Document();
    doc.add(new SuggestField("suggest", "Hi everybody!",4));
    writer.addDocument(doc);
    doc = new Document();
    doc.add(new SuggestField("suggest", "nice to meet you",4));
    writer.addDocument(doc);
    writer.commit(); // maybe redundant
    writer.close();
    var reader = DirectoryReader.open(dir);
    var searcher = new SuggestIndexSearcher(reader);
    var query = new PrefixCompletionQuery(analyzer, new Term("suggest", "everyb"));
    TopDocs results = searcher.search(query, 5);
    for (var res : results.scoreDocs) {
        System.out.println(reader.document(res.doc).get("id"));
    }
}

这就是我得到的:

Exception in thread "main" java.lang.IllegalArgumentException: suggest is not a SuggestField
at org.apache.lucene.search.suggest.document.CompletionWeight.bulkScorer(CompletionWeight.java:86)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:658)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:445)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:574)
at org.apache.lucene.search.IndexSearcher.searchAfter(IndexSearcher.java:421)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:432)
at experiments.main.main(main.java:67) #TopDocs results = searcher.search(query, 5);

尽量完整,项目依赖于 lucene-core 8.8.2 和 lucene-suggest 8.8.2 。 我哪里错了?

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    我认为您必须通过向索引编写器添加自定义编解码器来更改建议字段的发布格式。

    例如这样的:

    RAMDirectory dir = new RAMDirectory();
    Analyzer analyzer = new CompletionAnalyzer(new StandardAnalyzer());
    IndexWriterConfig config = new IndexWriterConfig(analyzer);
    Codec codec = new Lucene87Codec() {
        @Override
        public PostingsFormat getPostingsFormatForField(String field) {
            if (field.equals("suggest")) {
                return new Completion84PostingsFormat();
            }
            return super.getPostingsFormatForField(field);
        }
    };
    config.setCodec(codec);
    IndexWriter indexWriter = new IndexWriter(dir, config);
    

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多