【问题标题】:ElasticSearch query/search/matchElasticSearch 查询/搜索/匹配
【发布时间】:2013-05-21 17:37:20
【问题描述】:

我在我的 ElasticSearch 索引中插入了 3 条记录,如下所示:

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1'  -d '
{ "cityNames" : [ { "language" : "ENG",
    "name" : "w bridgewater",
    "raw_name" : "W BRIDGEWATER"
  },
  { "language" : "ENG",
    "name" : "west bridgewater",
    "raw_name" : "West Bridgewater"
  }
],
"id" : 1,
  "streetNames" : [ { "language" : "ENG",
    "name" : "cram rd",
    "raw_name" : "Cram Rd"
  } ]
}'

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1'  -d '
{ "cityNames" : [ { "language" : "ENG",
    "name" : "bridgewater corners",
    "raw_name" : "BRIDGEWATER CORNERS"
  },
  { "language" : "ENG",
    "name" : "bridgewater center",
    "raw_name" : "Bridgewater Center"
  }
],
"id" : 2,
"streetNames" : [ { "language" : "ENG",
    "name" : "valley view rd",
    "raw_name" : "Valley View Rd"
  } ]
}'

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1'  -d '
{ "cityNames" : [ { "language" : "ENG",
    "name" : "bridgewater",
    "raw_name" : "Bridgewater"
  },
  { "language" : "ENG",
    "name" : "windsor",
    "raw_name" : "Windsor"
  }
],
"id" : 3,
"streetNames" : [ { "language" : "ENG",
    "name" : "valley view rd",
    "raw_name" : "Valley View Rd"
  } ]
}'

然后我执行如下搜索:

curl -XGET 'http://127.0.0.1:9200/geoindex_test/STREET/_search?pretty=1'  -d '
{
"query" : {
    "match" : { "cityNames.name" : "bridgewater" }
}
}'

我认为 ElasticSearch 会返回第三条记录 (id == 3) 作为最佳匹配(记录 3 是唯一与“bridgewater”完全匹配的记录),但它会返回 id 1 (w bridgewater) 的记录作为最佳匹配。我做错了什么?

【问题讨论】:

  • 如果您在请求中启用解释输出,您可以看到详细说明。只需将explain=true 请求参数添加到url。如果您可以将输出添加到您的答案中,我很乐意为您提供帮助。
  • @javanna - 谢谢你的回复。 explain=true 的输出超过了 stackoverflow 允许的字符数。抱歉,我无法提供信息。
  • 也许您可以只发布相关部分或使用第三方服务,如 pastebin 或 github gist。
  • @javanna - 我以前从未使用过 pastebin。希望您可以访问我的帖子:pastebin.com/bfZQ9Uny
  • 你得到的答案非常好。如您所见,前两个文档的 tf (term frequency) 2 与答案中解释的原因相同。第三个文档的 fieldNorm 更高,这就是它完美匹配的因素,但由于词频只是其中一个,其他文档的相关性更高。

标签: elasticsearch


【解决方案1】:

我想这是因为您使用的内部对象基本上将其下的对象折叠成一个以用于搜索目的。因此,例如,当您查询对象 1 的搜索字段时,您查询的是 ["w bridgewater", "west bridgewater"],而不是您想象的离散字段。

由于“bridgewater”在对象 1 和 2(两个名称字段)中出现两次,而在对象 3 中出现一次,因此这些项目在搜索中的排名更高。最终选择对象 1,因为出现“bridgewater”的字段比对象 2 中的字符串短(“w bridgewater”与“bridgewater corners”)。

不要像你正在做的那样使用内部对象,而是使用嵌套对象http://www.elasticsearch.org/guide/reference/mapping/nested-type/。将得分模式设置为“max”,然后会以更直观的方式为您匹配。

【讨论】:

  • 你知道吗?我喜欢你编辑答案的方式,很有意义!即使看到解释的输出总是有帮助的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多