【发布时间】:2017-02-10 16:51:06
【问题描述】:
在我的 Neo4j 图表中,我只需要一种特定类型的节点可供用户搜索。该节点具有标签“同义词”和只有一个属性“别名”。
我正在使用GraphAware Neo4j Elasticsearch Integration (Neo4j Module),它将图形复制到弹性搜索,即它为我创建了一个弹性搜索索引。然后我可以进行类似
的查询CALL ga.es.queryNode('{\"query\":{\"match\":{\"alias\":\"mySynonym\"}}}')
YIELD node RETURN node
这可行,但我想使用n gram tokenizer 作为我的同义词,即“别名”属性。目前,上面的查询只在我输入全名时返回结果,即“mySynonym”,但在我只输入“myS”时不会返回。
在模块文档中,我找不到任何关于标记器的信息。所以我尝试像这样更新 Neo4J 模块创建的弹性搜索索引:
PUT neo4j-index-node/_settings
{
"analysis": {
"analyzer": {
"my_analyser": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20,
"token_chars": [
"letter",
"digit",
"punctuation"
]
}
}
}
}
然后:
PUT neo4j-index-node/_mapping/Synonym?update_all_types
{
"properties": {
"alias": {
"type": "text",
"analyzer": "my_analyser",
"search_analyzer": "my_analyser"
}
}
}
第二个命令给我一个错误:
用于 [alias] 的映射器与其他中的现有映射冲突 types:\n[mapper [alias] 有不同的 [analyzer]
我在某处读到,创建索引后无法更改映射。但是我的索引是由 Neo4j 模块创建的,我不知道如何事先指定标记器。
有什么想法吗?谢谢!
【问题讨论】:
-
GraphAware 插件实际上并不创建映射。当第一次插入文档时未指定映射以使用动态映射时,这是默认的 ES 行为。正如所回答的那样,事先创建映射是您的职责,绝对不是 Neo4j 数据库为您执行此操作,这可能会导致非常意外的行为。
标签: elasticsearch neo4j tokenize graph-databases graphaware