【问题标题】:Elastic - Only return fully matching documents弹性 - 仅返回完全匹配的文档
【发布时间】:2021-01-19 08:36:44
【问题描述】:

拥有以下数据集:

[
{
 "id": 234,
 "category": "shoe"
},
{
 "id": 44,
 "category": "shoes"
},
{
 "id": 49,
 "category": "blue shoes"
},
{
 "id": 48,
 "category": "small shoes with glare"
}
]

类别的映射设置为文本。

然后进行如下查询:

$query = (new ElasticQuery())
            ->setQuery([
                "bool" => [
                    "must" => [
                        "match" => [
                            "category" => [
                                "query" => "shoe size 22"
                            ],
                        ]
                    ]
                ],
            ]);

Elastic 总是将我作为第一个结果/最高分返回:

  • 有眩光的小鞋
  • 蓝色鞋子

而不是鞋子。

我如何告诉 elastic 我只想要匹配 100% 的类别内容的文档? (不是查询)

我的意思是,如果我的搜索不包含“蓝鞋”,我不希望出现蓝色结果。我只希望得到鞋子或鞋子和鞋子的最大值。

我不能使用术语,因为正如我所说,我不希望与查询完全匹配。我希望匹配的文档字段完全匹配。

例子:

  • 查询:鞋码 22
  • 预期结果:
  • 查询:有眩光的小鞋
  • 预期结果:
  • 有眩光的小鞋
  • 查询:蓝色鞋子
  • 预期结果:
  • 蓝色鞋子
  • 查询:绿鞋
  • 预期结果:

【问题讨论】:

    标签: php elasticsearch match exact-match


    【解决方案1】:

    据我所知,没有直接的方法可以实现您的用例。您可以使用Percolate query 来实现您的用例。

    添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "category": {
            "type": "text"
          },
          "query": {
            "type": "percolator"
          }
        }
      }
    }
    

    索引数据:

    {
      "query": {
        "match": {
          "category": {
            "query": "shoe"
          }
        }
      }
    }
    {
      "query": {
        "match": {
          "category": {
            "query": "shoes"
          }
        }
      }
    }
    {
      "query": {
        "match": {
          "category": {
            "query": "blue shoes",
            "operator": "AND"
          }
        }
      }
    }
    {
      "query": {
        "match": {
          "category": {
            "query": "small shoes with glare
    ",
            "operator": "AND"
          }
        }
      }
    }
    

    搜索查询:

        {
          "query": {
            "percolate": {
              "field": "query",
              "document": {
                "category": "green shoes"
              }
            }
          }
        }
    

    搜索结果:

    "hits": [
          {
            "_index": "65787899",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.13076457,
            "_source": {
              "query": {
                "match": {
                  "category": {
                    "query": "shoes",
                    "operator": "AND"
                  }
                }
              }
            },
            "fields": {
              "_percolator_document_slot": [
                0
              ]
            }
          }
        ]
    

    【讨论】:

    • @FrakyDale 请仔细阅读答案,如果这能解决您的问题,请告诉我?
    • soz,直到现在我才有时间尝试:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多