Elastic Search 6.4.2 объединяет поиск нечеткости с точным поиском - PullRequest
0 голосов
/ 23 октября 2018

Проект в 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 голосов
/ 23 октября 2018

Вместо того, чтобы выполнять какой запрос в зависимости от того, что вводит пользователь для этого сценария, я создал ниже общий запрос, и я полагаю, что этого будет достаточно для ваших требований.

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 и, следовательно,будет отображаться в верхней части результатов поиска.

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...