弹性搜索字词查询不匹配 URL 的
Elastic Search Term Query Not Matching URL's
我是 Elastic 搜索的初学者,我正在研究上周的 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 将阻止它被标记化因此我可以寻找一个在术语查询中与该字段完全匹配。
我也尝试过使用 whitespace 分析器作为 URL 值,因此没有任何白色 space 字符。但是我还是无法成功命中。
以下是我的术语查询:
{
"query":{
"constant_score": {
"filter": {
"term": {
"url":"http://www.example.com/foo/navestelre-04-cop"
}
}
}
}
}
我猜问题出在分析器和分词器的某个地方,但我无法找到解决方案。任何形式的帮助都会极大地增强我的知识,并帮助我找到解决方案。
提前致谢。
你的想法是对的,但看起来你的设置请求中的一些小错误让你误入歧途。这是最终的索引请求:
POST /test
{
"settings": {
"number_of_shards" : 5
},
"mappings": {
"url_test": {
"properties": {
"url": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
注意映射中添加的 url_test
类型。这让 ES 知道您的映射适用于此文档类型。另外,settings
和mappings
也是根对象的不同键,所以要分开。因为你的初始设置请求格式错误,ES直接忽略了它,并在你的文档上使用了标准分析器,这导致你无法用你的查询来查询它。我给你指出 the ES Mapping docs
我们可以索引两个文档来测试:
POST /test/url_test/1
{
"url":"http://www.example.com/foo/navestelre-04-cop"
}
POST /test/url_test/2
{
"url":""
}
然后执行您未修改的搜索查询:
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"
}
}
]
我是 Elastic 搜索的初学者,我正在研究上周的 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 将阻止它被标记化因此我可以寻找一个在术语查询中与该字段完全匹配。
我也尝试过使用 whitespace 分析器作为 URL 值,因此没有任何白色 space 字符。但是我还是无法成功命中。
以下是我的术语查询:
{
"query":{
"constant_score": {
"filter": {
"term": {
"url":"http://www.example.com/foo/navestelre-04-cop"
}
}
}
}
}
我猜问题出在分析器和分词器的某个地方,但我无法找到解决方案。任何形式的帮助都会极大地增强我的知识,并帮助我找到解决方案。 提前致谢。
你的想法是对的,但看起来你的设置请求中的一些小错误让你误入歧途。这是最终的索引请求:
POST /test
{
"settings": {
"number_of_shards" : 5
},
"mappings": {
"url_test": {
"properties": {
"url": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
注意映射中添加的 url_test
类型。这让 ES 知道您的映射适用于此文档类型。另外,settings
和mappings
也是根对象的不同键,所以要分开。因为你的初始设置请求格式错误,ES直接忽略了它,并在你的文档上使用了标准分析器,这导致你无法用你的查询来查询它。我给你指出 the ES Mapping docs
我们可以索引两个文档来测试:
POST /test/url_test/1
{
"url":"http://www.example.com/foo/navestelre-04-cop"
}
POST /test/url_test/2
{
"url":""
}
然后执行您未修改的搜索查询:
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"
}
}
]