在我的Neo4j图中,我只需要一个特定类型的节点可供用户搜索。此节点具有标签“Synonym”,并且只有一个属性“alias”。
我正在使用GraphAware Neo4j Elasticsearch Integration (Neo4j Module)将图表复制到弹性搜索,即它为我创建弹性搜索索引。然后我可以进行像
这样的查询CALL ga.es.queryNode('{\"query\":{\"match\":{\"alias\":\"mySynonym\"}}}')
YIELD node RETURN node
这有效,但我想用n gram tokenizer作为我的同义词,即“alias”属性。目前,上面的查询只会在输入全名后返回结果,即“mySynonym”,但不会在我只输入“myS”时返回。
在模块文档中,我找不到有关tokenizer的任何信息。所以我尝试更新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"
}
}
}
第二个命令给我一个错误:
[别名]的映射器与其他映射中的现有映射冲突 类型:\ n [mapper [alias]有不同的[analyzer]
我在某处读到,在创建索引之后无法更改映射。但是我的索引是由Neo4j模块创建的,我不知道如何预先指定tokenizer。
有什么想法吗?谢谢!
答案 0 :(得分:1)
确实无法修改现有的映射。删除所有现有索引。尝试首先为Neo4j索引创建ES模板(在导入Neo4j数据之前)。
可以像这样创建模板:
PUT _template/template_1
{
"template": "te*",
"settings": {
"number_of_shards": 1
},
"mappings": {
"type1": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z YYYY"
}
}
}
}
}
..在模板中设置索引模式。然后在设置部分中添加您的自定义分析器:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
..然后开始索引数据。我向您展示了2个示例查询,但您应该将它们组合成一个