5

也许我真的错过了一些东西。

我在 Lucene 中索引了一堆键/值对(如果重要,v4.1)。假设我有 key1=value1 和 key2=value2,例如从属性文件中读取。

它们被索引为特定字段和包罗万象的“ALL”字段,例如

new Field("key1", "value1", aFieldTypeMimickingKeywords);
new Field("key2", "value2", aFieldTypeMimickingKeywords);
new Field("ALL", "key1=value1", aFieldTypeMimickingKeywords);
new Field("ALL", "key2=value2", aFieldTypeMimickingKeywords);
// then get added to the Document of course...

然后我可以使用通配符搜索

new WildcardQuery(new Term("ALL", "*alue1"));

它会找到成功的。

但是,最好能获得更多信息,例如“与该命中相关的完整值是什么(例如“key1=value1”)?”。

最好的办法是获取文档,然后获取 IndexableFields 的列表,然后遍历所有这些并查看 field.stringValue().contains("alue1") 是否。(我可以查看调试器中的数据结构,所有信息都在那里)

这似乎完全是疯狂的原因,这不是Lucene 刚刚所做的吗?命中信息不应该返回一些字段吗?

Lucene 是否缺少看似“明显”的功能?谷歌并从 API 开始并没有透露任何直接的信息,但我觉得我一定是在搜索错误的东西。

4

1 回答 1

5

您可能想尝试使用IndexSearcher.explain()方法。获得匹配文档的 ID 后,为每个字段准备一个查询(使用相同的搜索关键字)并为每个查询调用Explanation.isMatch():产生 true 的将为您提供匹配的字段。例子:

for (String field: fields){
    Query query = new WildcardQuery(new Term(field, "*alue1"));
    Explanation ex = searcher.explain(query, docID);
    if (ex.isMatch()){
        //Your query matched field
    }
}
于 2013-03-04T17:46:11.163 回答