Я пытаюсь реализовать полнотекстовый поиск по индексу Lucene с помощью службы документов OSGi RDB, но он не работает,
Поиск Lucene работает нормально, если я создал репозиторий, как показано ниже,
Сценарий 1: поиск работает корректно
@Override
protected ContentRepository createRepository() {
return getOakRepo().createContentRepository();
}
Oak getOakRepo() {
// LowCostLuceneIndexProvider provider = new LowCostLuceneIndexProvider();
LuceneIndexProvider provider = new LuceneIndexProvider();
return new Oak(createInitialContent())
.with(new OpenSecurityProvider())
.with((QueryIndexProvider) provider)
.with((Observer) provider)
.with(new LuceneIndexEditorProvider());
}
private DocumentNodeStore createInitialContent()
{
DocumentNodeStore ds=createRDBStore();
EditorHook hook = new EditorHook(
new CompositeEditorProvider(new NamespaceEditorProvider(), new TypeEditorProvider()));
OakInitializer.initialize(ds, new InitialContent(), hook);
return ds;
}
public DocumentNodeStore createRDBStore()
{
String jdbcurl="jdbc:postgresql://127.0.0.1:5432/SP05";
String user="postgres";
String pw="manager";
DataSource dataSource = RDBDataSourceFactory.forJdbcUrl(jdbcurl, user, pw);
DocumentNodeStore store = new RDBDocumentNodeStoreBuilder().newRDBDocumentNodeStoreBuilder()
.setRDBConnection(dataSource).build();
возврат магазина; }
Сценарий 2: поиск не работает
@Autowired
private NodeStore documentNodeStoreService;
@Override
protected ContentRepository createRepository() {
return getOakRepo().createContentRepository();
}
Oak getOakRepo() {
// LowCostLuceneIndexProvider provider = new LowCostLuceneIndexProvider();
LuceneIndexProvider provider = new LuceneIndexProvider();
return new Oak(intializeNodeStoreService())
.with(new OpenSecurityProvider())
.with((QueryIndexProvider) provider)
.with((Observer) provider)
.with(new LuceneIndexEditorProvider());
}
private static CommitInfo createCommitInfo() {
Map<String, Object> infoMap = ImmutableMap.<String, Object>of(CommitContext.NAME, new SimpleCommitContext());
return new CommitInfo(SESSION_ID, null, infoMap);
}
private NodeStore intializeNodeStoreService() {
EditorHook hook = new EditorHook(
new CompositeEditorProvider(new NamespaceEditorProvider(), new TypeEditorProvider()));
try {
NodeBuilder builder = documentNodeStoreService.getRoot().builder();
new InitialContent().initialize(builder);
documentNodeStoreService.merge(builder, hook, createCommitInfo());
} catch (CommitFailedException e) {
throw new RuntimeException(e);
}
return documentNodeStoreService;
}
В этом случае хранилище создается, но поиск не работает, выдавая ошибку, такую как запрос обхода (запрос без индекса)
Может Вы говорите мне, что я не так делаю здесь?
Код для создания индекса Lucene в обоих сценариях,
Tree index = root.getTree("/");
Tree indexDefn = createTestIndexNode(index, LuceneIndexConstants.TYPE_LUCENE);
TestUtil.useV2(indexDefn);
indexDefn.setProperty(LuceneIndexConstants.TEST_MODE, true);
indexDefn.setProperty(FulltextIndexConstants.EVALUATE_PATH_RESTRICTION, true);
Tree props = TestUtil.newRulePropTree(indexDefn, "nt:base");
props.getParent().setProperty(FulltextIndexConstants.INDEX_NODE_NAME, true);
TestUtil.enablePropertyIndex(props, "c1/p", false);
TestUtil.enableForFullText(props, FulltextIndexConstants.REGEX_ALL_PROPS, true);
TestUtil.enablePropertyIndex(props, "a/name", false);
TestUtil.enablePropertyIndex(props, "b/name", false);
TestUtil.enableFunctionIndex(props, "length([name])");
TestUtil.enableFunctionIndex(props, "lower([name])");
TestUtil.enableFunctionIndex(props, "upper([name])");
root.commit();
}