【问题标题】:How i can get exact match filter result in Elastic Search我如何在 Elastic Search 中获得完全匹配过滤器结果
【发布时间】:2019-08-19 15:13:56
【问题描述】:

我有一个关于弹性搜索的问题,我想在过滤器中搜索完全匹配的内容。例如,如果颜色过滤器仅应用“黑色”,则弹性搜索应仅返回“黑色”产品,而不是产品颜色中包含黑色关键字的其他产品,如“黑灰色”。 我尝试了“match_phrase”而不是“match”,但什么也得不到。

请查看我的 JSON 字符串截图:https://www.screencast.com/t/wjCcpfQwTxw

提前致谢

【问题讨论】:

  • 请显示您尝试过的查询,以及您当前拥有的索引映射。
  • 非常感谢您的回复,请检查上述 JSON 字符串格式。
  • 请不要提供截图,因为它既不容易复制/粘贴也不容易搜索。还需要您的索引映射,谢谢!

标签: php elasticsearch exact-match


【解决方案1】:
You can user term query.
For example: 
GET {Your index}/_search
{
    "query": {
        "term": {
            "color.keyword": {
                "value": "Black"
            }
        }
    }
}

It will return the documents which 'color' field equals to Black.If your color field is text type.Remember add '.keyword' after it.

【讨论】:

  • .keyword 为我完成了这项工作
  • 我不喜欢将 .keyword 添加到现有字段,我没有得到查询结果。是否有一些配置可以使用这个隐式关键字?我发现我可以在这种查询中将 .anything 添加到字段名称中,并且 API 不会抛出错误。它只是无法返回任何结果。
【解决方案2】:

要获得完全匹配,请对字段 color 使用类型 keyword。这是一个 curl 的例子。使用 Elasticsearch 7.3 测试

  1. 创建索引

    curl -X PUT "localhost:9200/products?pretty" -H 'Content-Type: application/json' -d' {} '

  2. 为 type 关键字的字段颜色定义一个映射。

    curl -X PUT "localhost:9200/products/_mapping?pretty" -H 'Content-Type: application/json' -d' { “特性”: { “颜色”: { “类型”:“关键字” } } } '

  3. 添加两个样本数据集

    *curl -X PUT "localhost:9200/products/_doc/1?pretty" -H 'Content-Type: application/json' -d' { “颜色”:“蓝绿色” } '

    curl -X PUT "localhost:9200/products/_doc/2?pretty" -H 'Content-Type: application/json' -d' { “颜色”:“蓝色” } '*

  4. 测试查询。

    curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d' { "query": { "match": { "color": “蓝色”} } } '

【讨论】:

  • 欢迎来到 SO。请给出一个代码示例。现在,您的回答更像是评论。
  • 感谢您的反馈。我添加了一个如何定义关键字字段的详细示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多