对二进制文件建立索引并使用 contains 进行搜索,找不到结果

问题描述 投票:0回答:1

我想请求您帮助理解我在构建一个工作示例时出错的地方,在该示例中我用二进制数据填充存储库,为其建立索引,然后运行包含查询。

我有 TRACE 日志,并且在执行查询时我看到索引正在工作,但我总是得到 0 个结果。

Repository 是 MemoryNodeStore,我是这样创建的:

LuceneIndexProvider provider = new LuceneIndexProvider();
Oak oak = new Oak(ns) // ns is a NodeStore MemoryNodeStore
.with((QueryIndexProvider) provider)
.with((Observer) provider)
.with(new LuceneIndexEditorProvider());
repository = new Jcr(oak).createRepository();

然后我用这种方式填充它:

Node node = rootNode.addNode("node" + i, "nt:unstructured");
byte[] data = ("testo" + i).getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
Binary binary = session.getValueFactory().createBinary(bais);
try {
    node.setProperty("binaryData", binary);

} finally {
    binary.dispose();
}
node.setProperty("jcr:mimeType", "text/plain");

那么索引是这样的:

Node root = session.getRootNode();
Node oakIndex = root.getNode("oak:index");
Node index = oakIndex.addNode("contentTextIndex", "oak:QueryIndexDefinition");
index.setProperty("type", "lucene");
index.setProperty("async", (String[]) null);
Node indexRules = index.addNode("indexRules", "nt:unstructured");
Node ntBase = indexRules.addNode("nt:base", "nt:unstructured");
Node properties = ntBase.addNode("properties", "nt:unstructured");
Node binaryDataProperty = properties.addNode("binaryData", "nt:unstructured");
binaryDataProperty.setProperty("name", "binaryData";
binaryDataProperty.setProperty("propertyIndex", true);
binaryDataProperty.setProperty("analyzed", true);
Node jcrMimeTypeProperty = properties.addNode("jcr:mimeType");
jcrMimeTypeProperty.setProperty("name", "jcr:mimeType");
jcrMimeTypeProperty.setProperty("propertyIndex", true);
jcrMimeTypeProperty.setProperty("analyzed", true);

然后我这样搜索:

String sql2QueryString = "SELECT * FROM [nt:base] WHERE CONTAINS([binaryData], 'testo')";
Query sql2Query = queryManager.createQuery(sql2QueryString, Query.JCR_SQL2);
QueryResult result = sql2Query.execute();

我这样读结果:

NodeIterator nodes = result.getNodes();
while (nodes.hasNext()) {
    Node node = nodes.nextNode();
    log.info("Path: " + node.getPath());
    counter++;
}
log.info("Found {} results", counter);

我正在使用 Oak 1.68.0 以及 tika-core 和 tika-parsers-standard-package 2.9.2。

在日志中,我正确地看到了索引和文本提取,如果您愿意,我可以附加完整的日志。

非常感谢您的帮助,最诚挚的问候

java lucene apache-tika jcr jackrabbit-oak
1个回答
0
投票

我发现文档具有误导性。我会尝试修复它。

  • 对于二进制数据,不需要设置该属性。如果设置了 mime 类型并且节点是索引的一部分,则二进制属性会自动添加到全文索引(但仅限于此)。
  • 您需要使用例如查询全文索引。
    SELECT * FROM [nt:base] WHERE CONTAINS(*, 'testo1')
  • 您已添加
    "testo" + i
    ,因此您还需要查询,例如
    testo1
    (见上文),而不是
    testo
  • 设置
    analyzed
    propertyIndex
    对于二元属性没有效果。它们不会被添加到该属性的属性索引或全文索引中;它们只会添加到该节点(文档)的全文索引中。
  • 如果您没有查询
    jcr:mimeType
    属性,则无需为其建立索引。对此属性的查询将有一个带有
    jcr:mimeType
    的条件。
© www.soinside.com 2019 - 2024. All rights reserved.