0

我是弹性搜索的初学者,从上周开始我正在研究 POC。我的文档中有一个 URL 字段,其中包含以下格式的 URL:“ http://www.example.com/foo/navestelre-04-cop ”。

我无法定义到我的整个对象的映射,因为每个对象都有不同的键,除了 URL。

这是我创建索引的方式:

POST 
{
    "settings" : {
        "number_of_shards" : 5,
    "mappings" : {
            "properties" : {
                "url" : { "type" : "string","index":"not_analyzed" }
            }
    }
}
}

我将我的 URL 字段保持为 not_analyzed,因为我从一些资源中了解到将字段标记为 not_analyzed 会阻止它进行标记化,因此我可以在术语查询中查找该字段的完全匹配。

我还尝试使用空白分析器作为 URL 值,因此没有任何空白字符。但是我再次无法成功命中。

以下是我的术语查询:

{
"query":{
    "constant_score": {
       "filter": {
       "term": {
          "url":"http://www.example.com/foo/navestelre-04-cop"
       }
       }
    }
}

}

我猜问题出在分析器和标记器的某个地方,但我无法找到解决方案。任何形式的帮助都会极大地增强我的知识并帮助我找到解决方案。提前致谢。

4

1 回答 1

2

您的想法是正确的,但您的设置请求中的一些小错误似乎让您误入歧途。这是最终的索引请求:

POST /test
{
    "settings": {
        "number_of_shards" : 5
    },                           
   "mappings": {
      "url_test": {
         "properties": {
            "url": {
               "type": "string",
               "index": "not_analyzed"
            }
         }
      }
   }
}

注意url_test映射中添加的类型。这让 ES 知道您的映射适用于该文档类型。而且,settingsmappings也是根对象的不同键,所以它们必须分开。因为您的初始设置请求格式不正确,ES 只是忽略了它,并在您的文档上使用了标准分析器,这导致您无法使用您的查询来查询它。我指给你看ES Mapping 文档

我们可以索引两个文档进行测试:

POST /test/url_test/1
{
    "url":"http://www.example.com/foo/navestelre-04-cop"
}

POST /test/url_test/2
{
    "url":"http://stackoverflow.com/questions/37326126/elastic-search-term-query-not-matching-urls"
}

然后执行您未修改的搜索查询:

GET /test/_search
{
   "query": {
      "constant_score": {
         "filter": {
            "term": {
               "url": "http://www.example.com/foo/navestelre-04-cop"
            }
         }
      }
   }
}

产生这个结果:

"hits": [
         {
            "_index": "test",
            "_type": "url_test",
            "_id": "1",
            "_score": 1,
            "_source": {
               "url": "http://www.example.com/foo/navestelre-04-cop"
            }
         }
      ]
于 2016-05-19T15:17:21.223 回答