【问题标题】:How do I tokenize data that is replicated from Neo4j to Elastic search?如何标记从 Neo4j 复制到 Elastic 搜索的数据?
【发布时间】: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


【解决方案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"
        }
      }
    }
  }
}

.. 在 template 中设置您的索引模式。然后在 settings 部分中添加您的自定义分析器,如下所示:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom",
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

.. 然后开始索引数据。我向您展示了 2 个示例查询,但您应该将它们合并为一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 2022-11-30
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多