0

我目前有一个在本地 Cassandra 后端上运行 Titan 的 VM,并且希望能够使用 ElasticSearch 使用 CONTAINS 匹配项和正则表达式来索引字符串。这是我到目前为止所拥有的:

  • 在 titan.sh 运行之后,一个 Groovy 脚本用于从单独的顶点和边缘文件中加载数据。该脚本的第一阶段从 Titan 加载图形并设置 ES 属性:

    config.setProperty("storage.backend","cassandra") config.setProperty("storage.hostname","127.0.0.1")

    config.setProperty("storage.index.elastic.backend","elasticsearch") config.setProperty("storage.index.elastic.directory","db/es") config.setProperty("storage.index.elastic.client -only","false") config.setProperty("storage.index.elastic.local-mode","true")

  • 脚本的第二部分设置索引类型:

    g.makeKey("property").dataType(String.class).indexed("elastic",Edge.class).make();

  • 第三部分从 CSV 文件中加载数据,这已经过测试并且工作正常。

我的问题是,当我进行 Gremlin 查询时,我似乎无法使用 ElasticSearch 功能。例如:

g.E.has("property",CONTAINS,"test")

返回 0 结果,即使我知道该字段包含该属性的字符串“test”至少一次。更奇怪的是,当我将 CONTAINS 更改为 ElasticSearch 无法识别的内容时,我收到“没有此类属性”错误。我还可以执行精确的字符串匹配和任何数值比较,包括大于或小于,但是我希望在这些实例中使用默认索引方法而不是 ElasticSearch。

由于在我尝试运行更高级的 ES 查询时没有错误,我不知道是什么导致了这里的问题。有什么我可能错过的吗?

谢谢,亚当

4

1 回答 1

0

我不太确定你的代码出了什么问题。从你的描述来看,一切都很好。您可以尝试以下脚本(只需将其粘贴到您的 Gremlin REPL 中):

config = new BaseConfiguration()
config.setProperty("storage.backend","inmemory")
config.setProperty("storage.index.elastic.backend","elasticsearch")
config.setProperty("storage.index.elastic.directory","/tmp/es-so")
config.setProperty("storage.index.elastic.client-only","false")
config.setProperty("storage.index.elastic.local-mode","true")

g = TitanFactory.open(config)
g.makeKey("name").dataType(String.class).make()
g.makeKey("property").dataType(String.class).indexed("elastic",Edge.class).make()
g.makeLabel("knows").make()
g.commit()

alice = g.addVertex(["name":"alice"])
bob = g.addVertex(["name":"bob"])
alice.addEdge("knows", bob, ["property":"foo test bar"])

g.commit()

// test queries
g.E.has("property",CONTAINS,"test")
g.query().has("property",CONTAINS,"test").edges()

最后两行应该返回类似e[1t-4-1w][4-knows-8]. 如果这可行,但您仍然无法找出代码中的问题,那么如果您可以共享您的完整代码(例如在 Github 或 Gist 中),那就太好了。

干杯,丹尼尔

于 2014-03-03T20:55:51.223 回答