在Titan中使用ElasticSearch的索引类型

时间:2014-03-03 10:56:00

标签: cassandra elasticsearch titan indexed

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

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

    config.setProperty( “storage.backend”, “卡桑德拉”) config.setProperty( “storage.hostname”, “127.0.0.1”)

    config.setProperty( “storage.index.elastic.backend”, “elasticsearch”) config.setProperty( “storage.index.elastic.directory”, “分贝/ ES”) config.setProperty( “storage.index.elastic.client只”, “假”) config.setProperty( “storage.index.elastic.local模式”, “真”)

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

    g.makeKey( “属性”)的数据类型(String.class).indexed( “弹性的”,Edge.class)。使();

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

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

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

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

由于当我尝试运行更高级的ES查询时没有错误,我在这里导致问题的原因让我感到茫然。有什么我可能错过的吗?

谢谢, 亚当

1 个答案:

答案 0 :(得分: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中)。

干杯, 丹尼尔