使用有效负载和NLP标记进行Lucene搜索

使用有效负载和NLP标记进行Lucene搜索,lucene,nlp,opennlp,Lucene,Nlp,Opennlp,我已经为文档编制了索引,每个单词都有包含词性(POS)标记的有效负载。 我只想搜索那些搜索查询词带有POS标记的文档。 例如,“访问谷歌”用谷歌作为名词。它应该只显示以谷歌为名词的文档。 编写自定义分析器有帮助吗? 当负载在相似类中被访问时,我如何访问该术语?在lucene中进行精确(:google和:'Non')查询可能很棘手。。。您的查询是什么?您如何将文档写入索引?我建议使用span查询。Span查询可以返回一个Span对象,该对象允许检查每个匹配令牌的有效负载 请参阅PayloadTer

我已经为文档编制了索引,每个单词都有包含词性(POS)标记的有效负载。 我只想搜索那些搜索查询词带有POS标记的文档。 例如,“访问谷歌”用谷歌作为名词。它应该只显示以谷歌为名词的文档。 编写自定义分析器有帮助吗?
当负载在相似类中被访问时,我如何访问该术语?

在lucene中进行精确(:google和:'Non')查询可能很棘手。。。您的查询是什么?您如何将文档写入索引?

我建议使用span查询。Span查询可以返回一个Span对象,该对象允许检查每个匹配令牌的有效负载


请参阅PayloadTermQuery。

您可以使用PayloadAttribute类将标记存储为有效负载,然后重写DefaultSimilarity类的scorePayload方法以使用标记。在您的例子中,如果标记内容是noun,则返回1,否则返回零

下面的代码片段对于设置有效负载信息非常有用

    String tag = "noun";
    byte[] payload = tag.getBytes(); 
    Payload payloadData = new Payload(payload);
    payloadAttr.setPayload(payloadData);
现在使用以下代码行在检索期间使用标记。这必须通过扩展DefaultSimilarity类来完成

    class PayloadSimilarity extends DefaultSimilarity {
    ...
    ...
    protected float scorePayload(int doc, int start, int end, BytesRef payload) {
        String payloadData = payload.utf8ToString();
        return payloadData.equals("noun")? 1 : 0;
    }
    ...
    ...
    }    
最后,只需在检索期间将相似性类设置为扩展类

    searcher.setSimilarity(new PayloadSimilarity());

但这总是抑制动词。