我想请求您帮助理解我在构建一个工作示例时出错的地方,在该示例中我用二进制数据填充存储库,为其建立索引,然后运行包含查询。
我有 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。
在日志中,我正确地看到了索引和文本提取,如果您愿意,我可以附加完整的日志。
非常感谢您的帮助,最诚挚的问候
我发现文档具有误导性。我会尝试修复它。
SELECT * FROM [nt:base] WHERE CONTAINS(*, 'testo1')
"testo" + i
,因此您还需要查询,例如testo1
(见上文),而不是testo
。analyzed
和 propertyIndex
对于二元属性没有效果。它们不会被添加到该属性的属性索引或全文索引中;它们只会添加到该节点(文档)的全文索引中。jcr:mimeType
属性,则无需为其建立索引。对此属性的查询将有一个带有 jcr:mimeType
的条件。