PHP Elasticsearch поиск в начале строки - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть таблица продуктов в базе данных MySql, и я хочу выполнить поиск по названию и описанию их продукта.

Все работает хорошо, если я ввожу полное имя продукта в поиск, но это не так.разбить термин на части.Например, он найдет продукты для термина «пионер», но не найдет ничего для «pio» или «pionee».

Я полагаю, я либо неправильно строю индекс, либо неправильно выполняю поиск?

Я создаю свой индекс следующим образом:

$params = [
        'index' => 'products',
        'type' => 'product',
        'body' => [
            'settings' => [
                'analysis' => [
                    'filter' => [
                        'ngram_filter' =>  [
                            "type" => "ngram",
                            "min_gram" => 1,
                            "max_gram" => 10
                        ]
                    ],
                    'analyzer' => [
                        'ngram_analyzer' => [
                            "type" => "custom",
                            "tokenizer" => "standard",
                            "filter" => [
                                "lowercase",
                                "asciifolding",
                                "ngram_filter"
                            ]
                        ]
                    ]
                ]
            ],
            'mappings' => [
                'products' => [
                    'name' => [
                        'type' => 'string',
                        'include_in_all' => true,
                        'analyzer' => 'ngram_analyzer',
                        'search_analyzer' => 'standard'
                    ],
                    'description' => [
                        'type' => 'string',
                        'include_in_all' => true,
                        'analyzer' => 'ngram_analyzer',
                        'search_analyzer' => 'standard'
                    ]
                ]
            ]
        ]
    ];

Я индексирую результаты БД следующим образом:

 foreach($products as $product){

        $params = [
            'index' => 'products',
            'type' => 'product',
            'id' => $product['id'],
            'body' => [
                'name' => $product['name'],
                'description' => $product['description']
            ]
        ];

        $response = $client->index($params);
        var_dump($response);
    }

И затем для поиска я делаюследующее:

$params = [
    'index' => 'products',
    'type' => 'product',
    'body' => [
        'query' => [
            'match' => [
                'name' => $term
            ],
            'match' => [
                'description' => $term
            ]
        ]
    ]
];

$response = $client->search($params);


foreach($response['hits']['hits'] as $result){
    echo $result['_source']['name'] . '<br>';
}

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