【问题标题】:Using URL as ID in ElasticSearch在 ElasticSearch 中使用 URL 作为 ID
【发布时间】:2018-05-09 17:39:22
【问题描述】:

我正在使用 ElasticSearch 6.2.3,并且正在索引 ID 为 URL 的文档。当我查询索引时:

GET /ecm_sync/_search
{
  "query": {"match_all": {}}
}

我明白了:

...
"hits": [
      {
        "_index": "ecm_sync",
        "_type": "doc",
        "_id": "workspace://SpacesStore/07dfa82d-c6ce-469d-b881-4fab6cd9a277",
        "_score": 1,
...

现在,如果我使用这个 URL 并尝试直接获取它:

GET /ecm_sync/_doc/workspace%3A%2F%2FSpacesStore%2F07dfa82d-c6ce-469d-b881-4fab6cd9a277

我明白了:

{
  "_index": "ecm_sync",
  "_type": "_doc",
  "_id": "workspace://SpacesStore/07dfa82d-c6ce-469d-b881-4fab6cd9a277",
  "found": false
}

同样的事情发生在 Kibana 和 curl 上。我很久以前就看到有一个未解决的问题,但它已关闭,所以我不知道我是否做错了什么。

【问题讨论】:

  • 您是否尝试过不包含特殊字符的 ID?只是 UUID 部分?这会起作用吗?
  • 是的,但它不起作用。我知道 ES 通过特殊字符对字段进行标记,所以我不确定它是否对 ID 也一样。
  • 看看这个问题/答案,与使用非默认 ID 的路由相关:stackoverflow.com/questions/21003370/… ...我没有提供它作为答案,因为它已经过时了,但也许有里面的东西你可以用。在过去,我必须指定一个映射来防止标记化。情况可能不再如此。
  • 对不起,我不懂路由。我从来没有直接设置它。有没有办法列出所有路由?
  • 有可能,但是我有一段时间没用elasticsearch了,所以我需要搜索一下。

标签: json elasticsearch


【解决方案1】:

这种_id 格式(带有特殊/保留 字符)在“查询字符串搜索” 中使用时可能会出现警告/错误。使用请求正文搜索

GET ecm_sync/doc/_search
{
  "query": {
    "term": {
      "_id": {
        "value": "workspace://SpacesStore/07dfa82d-c6ce-469d-b881-4fab6cd9a277"
      }
    }
  }
}

如果您仍然需要通过查询字符串搜索来搜索一些棘手的字符串(尽管不需要),您必须手动转义所有 保留 字符:

GET ecm_sync/doc/_search?q=_id:workspace\:\/\/SpacesStore\/07dfa82d\-c6ce\-469d\-b881\-4fab6cd9a277

保留字符为:+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

【讨论】:

  • 这行得通,谢谢,但我想必须有一种正确的方法来按 ID 引用文档(所以我会在接受您的回答之前稍等片刻)。
  • @Bade,查看我的更新。但在这种情况下,您应该更喜欢“请求正文搜索”
  • 是的,这也有效。太糟糕了,我无法在 _doc GET 的 ID 部分中以同样的方式逃避它
猜你喜欢
  • 2011-12-21
  • 2016-05-10
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2016-12-27
相关资源
最近更新 更多