php - 弹性 - 仅返回完全匹配的文档
问题描述
具有以下数据集:
[
{
"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 总是将我作为第一个结果/最高分返回:
- 有眩光的小鞋
- 蓝鞋
- 鞋
而不是鞋。
我如何告诉弹性我只想要匹配是 100% 的类别内容的文档?(不是查询)
我的意思是,如果我的搜索不包含“蓝色鞋子”,我不希望出现蓝色结果。我只希望能得到最大的鞋子或鞋子和鞋子。
我不能使用术语,因为正如我所说,我不希望与查询完全匹配。我希望匹配的文档字段完全匹配。
例子:
- 查询:鞋码22
- 预期成绩:
- 鞋
- 查询:有眩光的小鞋
- 预期成绩:
- 有眩光的小鞋
- 鞋
- 查询:蓝鞋
- 预期成绩:
- 蓝鞋
- 鞋
- 查询:绿鞋
- 预期成绩:
- 鞋
解决方案
据我所知,没有直接的方法可以实现您的用例。您可以使用Percolate 查询来实现您的用例。
添加具有索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"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
]
}
}
]
推荐阅读
- python - TFLite 量化模型仍然输出浮点数
- cloud-foundry - 是否有任何执行类似 CF 推送功能的 Cloud Foundry V3 API
- fastlane - 如何为 FastLane 设置 ENV['INFO_PLIST']?
- django - Django 频道和 websocket 不工作
- botframework - 为什么 Microsoft Teams 不使用 openUrl 操作打开身份验证响应?
- javascript - Express/NodeJS - 上传图片和过滤产品的 RESTful 方式
- c# - 具有复杂过滤的查询 LINQ to XML c#
- flow - 在弹出窗口上恢复“暂停”流程
- python - 为什么 FFT 大小等于时域中的样本数?
- c++ - 为什么在 C++ 代码中使用“{”(C1075)会出现“找不到匹配的令牌”的问题