вложенный запрос bool не соответствует подмножеству атрибутов продукта

У PHP есть оценка короткого замыкания. Ваш пример был бы правильным использованием:

http://en.wikipedia.org/wiki/Short-circuit_evaluation#Support_in_common_programming_languages ​​

0
задан azgooon 18 January 2019 в 11:04
поделиться

1 ответ

Хорошо, я был не слишком далек от того, чего хотел достичь. Для тех, кто сюда доберется, я выкладываю свое решение проблемы. Короче говоря, мое отображение было неправильным, так как я использовал текст полей для:

  • id
  • sku
  • attr_set_name

после обновления моего сопоставления и установки типа поля на «ключевое слово» все стало еще более перспективным. Я решил переделать свой запрос и найти точные совпадения в этих полях, используя термин. Затем выяснилось, что точные совпадения должны быть слегка увеличены. После внесения дополнительных косметических изменений, окончательное отображение выглядит следующим образом:

        $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]

0
ответ дан azgooon 18 January 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: