Elastic Search 6.4.2将模糊性搜索与精确搜索相结合

时间:2018-10-23 12:54:55

标签: laravel elasticsearch search

Laravel的一个项目,更详细:用于Laravel Nova搜索。 我在ES中有一个模型规则,用于查找特定的Model记录。它具有以下规则

namespace App\Elastic\Rules;

use ScoutElastic\SearchRule;

class BusinessSearch extends SearchRule

/**
 * @inheritdoc
 */
public function buildHighlightPayload()
{
    return [
        'fields' => [
            'name' => [
                'type' => 'plain'
            ]
        ]
    ];
}

/**
 * @inheritdoc
 */
public function buildQueryPayload()
{
    $query = $this->builder->query;

    return [
        'should' => [
            [
                'multi_match' => [
                    'query'     => $query,
                    'fuzziness' => 5
                ]
            ],
            [
                'nested' => [
                    'path' => 'categories',
                    'query' => [
                        'bool' => [
                            'must' => [
                                'match' => [
                                    'categories.name' => $query
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ];
}

我需要以某种方式向此功能添加以下内容: 当用户在引号中键入值时,它必须执行exact search,否则必须像现在一样执行fuzziness。关于实现这些东西有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我没有根据要为这种情况提供什么样的输入用户来执行什么查询,而是创建了以下通用查询,并且我认为这足以满足您的要求。

POST testindex/_search
{  
   "query":{  
      "bool":{  
         "should":[  
            {  
               "bool":{  
                  "must":{  
                     "multi_match":{  
                        "query":"something",
                        "fields":[ "field_1", "field_2" ]
                     }
                  }
               }
            },
            {  
               "bool":{  
                  "must":{  
                     "multi_match":{  
                        "query":"something",
                        "fields":[  "field_1", "field_2" ],
                        "fuzziness": 5
                     }
                  }
               }
            }
         ]
      }
   }
}

为简单起见,上述查询类似于以下内容

bool:
  should:
    bool:
    - must [ exact query ]
    bool:
    - must [ fuzzy query ]

这两个查询都将对所有输入执行,但是如果exact query没有给您结果,则fuzzy query将为您返回结果。

现在,如果exact query确实返回了结果,则fuzzy query可能还会为您提供结果,除了exact query命中的结果最终将具有更高的relevancy_score,因此将显示在搜索结果的顶部。

让我知道是否有帮助!