ElasticSearch过滤精确网址

时间:2016-03-04 01:06:22

标签: elasticsearch

我想说我在索引中创建了这个文档:

put /nursery/rhyme/1
{
  "url" : "http://example.com/mary",
  "text" : "Mary had a little lamb"
}

为什么此查询不返回任何内容?

POST /nursery/rhyme/_search
{
   "query" :  {
     "match_all" : {}
   },
   "filter" : {
     "term" : {
       "url" : "http://example.com/mary"
     }
   }
}

3 个答案:

答案 0 :(得分:0)

Term Query查找包含倒排索引中指定的确切术语的文档。保存文档时,url属性为analyzed,它将生成以下术语(使用默认分析器):[http,example,com,mary]。

所以你现在对你的倒排索引是一堆术语,不是它们是http://example.com/mary

你想要的是not analyze url属性或者Match Query,它会将查询拆分成条件,就像索引一样。

答案 1 :(得分:0)

完全匹配不适用于analyzed字段。默认情况下,字符串为analyzed,这意味着http://example.com/mary字符串将被分割并存储在reverse indexhttpexamplecom,{{ 1}}。这就是你的查询没有输出的原因。

您可以设置字段mary

not analyzed

但为此您必须重新索引索引。

在这里研究not_analyzedterm query

希望这有帮助

答案 2 :(得分:0)

在 ElasticSearch 7.x 中,您必须在映射属性中使用类型“关键字”,该类型未解析 https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html