Elasticsearch 不能在开头使用斜杠

Elasticsearch doesn't work with an slash at beginning

我的数据库中充满了这样的文件:

{
  _index: "bla_bla",
  .
  .
  .
  _source: {
    domain: "somedomain.extension",
    path: "/you/know/the/path",
    lang: "en",
    keywords: ["yeah", "you", "rock", "dude", "help", "me", "good", "samaritan"]
  }
}

当我搜索时——不管我在寻找什么——它就像一个魅力,但是,如果我试图通过使用名为 path 的字段来过滤某些东西——只是——不起作用;不会抛出任何错误或警告。经过艰苦的研究,我想这是因为路径开头的斜线,我可能是对的还是错的,但无论如何我需要像这样过滤:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": {
                        "terms": {
                            "keywords": ["Whosebug", "rocks", "!"]
                        }
                    },
                    "must_not": {
                        "term": {
                            "path": "/"
                            // This works, i.e -> "lang": "en"
                        }
                    }
                }       
            }
        }
    },
    "from": 0,
    "size": 9
}

TL;DR:拥有 urls 的数据库,我如何才能只获得 non-root [路径比“/”]长?

免责声明:我不是 ES 方面的专家,但如果理解正确,你想要的是排除所有只有 / 的文档。到底。看到你总是将数据存储为 /path 如果你有一个包含 1 个字符的字符串,它应该总是 /,那么为什么不使用正则表达式呢?

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-regexp-filter.html

像这样的东西应该可以解决问题,我认为:

    {
    "query": {
        "filtered": {
            "filter": {
                "and": [
                    {
                        "bool": {
                            "should": {
                                "terms": {
                                    "keywords": [
                                        "Whosebug",
                                        "rocks",
                                        "!"
                                    ]
                                }
                            }
                        }
                    },
                    {
                        "filter": {
                            "regexp": {
                                "path": ".{1,}"
                            }
                        }
                    }
                ]
            }
        }
    },
    "from": 0,
    "size": 9
}

在 ElasticSearch 中,文本会根据许多字符拆分,包括斜线。您需要做的是使用 "not_analyzed" 索引。这是一个工作示例,请注意 "path" 字段上的索引规范:

PUT /index1/test/_mapping
{
    "test" : {
        "properties" : {
            "message" : {"type" : "string"},
            "path" : {"type" : "string", "index" : "not_analyzed"}
        }
    }
}

POST index1/test
{
  "path" : "/foo/bar"  
}

GET index1/test/_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "path": "/foo/bar"
        }
      }
    }
  }
}