У PHP есть оценка короткого замыкания. Ваш пример был бы правильным использованием:
http://en.wikipedia.org/wiki/Short-circuit_evaluation#Support_in_common_programming_languages
Хорошо, я был не слишком далек от того, чего хотел достичь. Для тех, кто сюда доберется, я выкладываю свое решение проблемы. Короче говоря, мое отображение было неправильным, так как я использовал текст полей для:
после обновления моего сопоставления и установки типа поля на «ключевое слово» все стало еще более перспективным. Я решил переделать свой запрос и найти точные совпадения в этих полях, используя термин. Затем выяснилось, что точные совпадения должны быть слегка увеличены. После внесения дополнительных косметических изменений, окончательное отображение выглядит следующим образом:
$params = [
'index' => $index,
'body' => [
'settings' => [
'analysis' => [
'analyzer' => [
'autocomplete' => [
'tokenizer' => 'autocomplete',
'filter' => [
'lowercase'
]
],
'autocomplete_search' => [
'tokenizer' => 'lowercase'
]
],
'tokenizer' => [
'autocomplete' => [
'type' => 'edge_ngram',
'min_gram' => 1,
'max_gram' => 50,
'token_chars' => [
'letter',
]
]
]
]
],
'mappings' => [
'_doc' => [
'properties' => [
'id' => [
'type' => 'keyword'
],
'sku' => [
'type' => 'keyword',
],
'attr_set_name' => [
'type' => 'keyword',
],
'name_search' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'autocomplete_search'
],
'attributes' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'autocomplete_search'
],
'super_attr' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'autocomplete_search'
],
'price' => [
'type' => 'float'
]
]
]
]
]
];
и запрос, который хорошо работает с этим:
$params = [
'index' => $index,
'size' => $hits,
'type' => '_doc',
'body' => [
"query" => [
"bool" => [
'should' => [
['match' => [
'name_search' => [
'query' => $phrase,
'operator' => 'and',
'boost' => 4,
]
]],
['match' => [
'name_search' => [
'query' => $phrase,
'operator' => 'or',
'fuzziness' => '1',
'boost' => 2,
]
]],
['match' => ['attr_set_name' => $phrase]],
['match' => [
'super_attr' => [
'query' => $phrase,
'boost' => 7,
]
]],
['match' => ['attributes' => $phrase]],
['term' => [
'sku' => [
'value' => $phrase,
"boost" => 5.0
]
]],
['term' => [
'id' => [
'value' => $phrase,
"boost" => 5.0
]
]],
],
"filter" => [
"range" => [
"price" => [
"gte" => $min,
"lte" => $max,
"boost" => 2.0
]
]
],
"minimum_should_match" => 2,
],
]
]
];
Я надеюсь, что однажды это кому-нибудь поможет: D [ 118]