【发布时间】:2014-01-07 21:45:02
【问题描述】:
我已经对文档进行了索引,其中每个单词都具有包含词性 (POS) 标记的有效负载。 我只想搜索搜索查询词具有该 POS 标签的那些文档。 例如。 'access google' 有 google 作为名词。它应该只显示以 google 作为名词的文档。 编写自定义分析器有帮助吗? 在 Similarity 类中访问 Payload 时如何访问 Term?
【问题讨论】:
我已经对文档进行了索引,其中每个单词都具有包含词性 (POS) 标记的有效负载。 我只想搜索搜索查询词具有该 POS 标签的那些文档。 例如。 'access google' 有 google 作为名词。它应该只显示以 google 作为名词的文档。 编写自定义分析器有帮助吗? 在 Similarity 类中访问 Payload 时如何访问 Term?
【问题讨论】:
在 lucene 中进行精确 (:google AND :'noun') 查询可能会很棘手...您的查询是什么以及如何将文档写入索引?
【讨论】:
我建议使用跨度查询。 Span 查询可以返回一个 Spans 对象,该对象允许检查每个匹配令牌的负载。
请参阅 PayloadTermQuery。
【讨论】:
您可以使用 PayloadAttribute 类将标签存储为有效负载,然后重写 DefaultSimilarity 类的 scorePayload 方法以使用标签。在您的情况下,如果标签内容是名词,则您希望返回 1,否则返回 0。
下面的代码sn -p对设置payload信息很有用
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());
【讨论】: