Titan 1.0 [伯克利+远程弹性搜索] 我们正在使用泰坦的这种组合。以下是属性文件 -
storage.backend=berkeleyje
storage.directory=D:/other-projects/graph-db/titan/enron-tk3/db/berkeley
index.search.backend=elasticsearch
index.search.index-name=akshayatitan
index.search.hostname=localhost
index.search.elasticsearch.client-only=true
index.search.elasticsearch.local-mode=false
我们只使用混合指数 现在我们通过Java代码添加一个具有少量属性的节点,然后获取它。
我们通过创建混合索引的属性进行查询 当我们通过密钥(创建混合索引的那个)查询节点时,我们不会立即获得该节点。但是延迟后可以使用 我们做错了什么?或者这是ES实例的延迟更新预期吗? 这是Java代码。
public static void main(String[] args) throws Exception {
GraphTest test = new GraphTest();
test.init();
Thread.sleep(10000);
String emailId = "emailId" + System.nanoTime();
test.createNode(emailId);
System.out.println("Create " + emailId);
System.out.println("First time " + test.getNode(emailId));
Thread.sleep(2000);
System.out.println("After a delay of 2 sec " + test.getNode(emailId));
}
public void createNode(String emailid) {
Vertex vertex = graph.addVertex("person");
vertex.property("emailId", emailid);
vertex.property("firstName", "First Name");
vertex.property("lastName", "Last Name");
vertex.property("address", "Address");
vertex.property("hometown", "Noida");
vertex.property("city", "Noida");
vertex.property("spousename", "Preeti");
graph.tx().commit();
}
public Object getNode(String emailId) {
Vertex vert = null;
String reString = null;
try {
vert = graph.traversal().V().has("emailId", emailId).next();
reString = vert.value("emailId");
} catch (NoSuchElementException e) {
e.printStackTrace();
} finally {
graph.tx().close();
}
return reString;
}
创建索引的代码是 -
private void createMixedIndexForVertexProperty(String indexName, String propertyKeyName, Class<?> propertyType) {
TitanManagement mgmt = ((TitanGraph) graph).openManagement();
try {
PropertyKey propertyKey = makePropertyKey(propertyKeyName, propertyType, mgmt);
TitanGraphIndex graphIndex = mgmt.getGraphIndex(indexName);
if (graphIndex == null) {
graphIndex = mgmt.buildIndex(indexName, Vertex.class)
.addKey(propertyKey, Parameter.of("mapping", Mapping.STRING)).buildMixedIndex("search");
} else {
mgmt.addIndexKey(graphIndex, propertyKey);
}
mgmt.commit();
} catch (Exception e) {
mgmt.rollback();
} finally {
}
}
public PropertyKey makePropertyKey(String propertyKeyName, Class<?> propertyType, TitanManagement mgmt) {
PropertyKey propertyKey = mgmt.getPropertyKey(propertyKeyName);
if (propertyKey == null) {
propertyKey = mgmt.makePropertyKey(propertyKeyName).dataType(String.class).make();
}
return propertyKey;
}
public void init() throws Exception {
graph = TitanFactory
.open(new PropertiesConfiguration(new File("src/test/resources/titan-berkeleydb-es.properties")));
createMixedIndexForVertexProperty("personnode", "emailId", String.class);
createMixedIndexForVertexProperty("personnode", "firstName", String.class);
createMixedIndexForVertexProperty("personnode", "lastName", String.class);
createMixedIndexForVertexProperty("personnode", "address", String.class);
createMixedIndexForVertexProperty("personnode", "hometown", String.class);
createMixedIndexForVertexProperty("personnode", "city", String.class);
createMixedIndexForVertexProperty("personnode", "spousename", String.class);
}
答案 0 :(得分:1)
之前已在Titan mailing list上讨论过这个问题。
请注意,ES索引(
index.refresh_interval
)存在延迟。 您无法更新/插入值并立即查询它。等等 在查询值之前至少1秒,否则结果可能是 空。
您还应该阅读关于索引行为的Elasticsearch文档(modifying your data和near real-time search):
Elasticsearch提供数据操作和搜索功能 接近实时。默认情况下,您可以预期一秒钟的延迟(刷新 interval)从你索引/更新/删除你的数据到你的数据 它出现在搜索结果中的时间。这很重要 区别于其他平台,如SQL,其中数据是立即的 交易完成后可用。
注意
refresh_interval
预计持续时间为1s
(1秒)或2m
(2 分钟)。像1
这样的绝对数字意味着1毫秒 - 这是一种可靠的方法 让你的集群瘫痪。