Elasticsearch построить запрос для продуктов с фильтром и подстановочными знаками - PullRequest
1 голос
/ 14 января 2020

Мы переключаемся с поиска в спящем режиме (lucene) наasticsearch. Все продукты хранятся в эластичном поиске со следующими полями:

name,description,articleNr, ean, herstellerNr, hersteller, price

. Предположим, мы должны хранить следующие продукты: (например, только: имя, цена, артикул)

Rückenschild Karton kurz/br ws 10St für Ordner 1010 2.08 2572373
Ordner 101050, PP A4 RB 80mm grau 180° Ordner Präzisionsmechanik 3.39 2572374
Ordner 101050, PP A4 RB 80mm hellblau 180° Ordner Präzisionsmechanik 3.39 2572375
Ordner 101050, PP A4 RB 80mm hellgrün 180° Ordner Präzisionsmechanik 3.39 2572376
Ordner 101050, PP A4 RB 80mm hellrot 180° Ordner Präzisionsmechanik 3.39
HERMA Special - Papier - matt - permanent selbstklebend - beschichtet - weiß - 61 x 297 mm - 90 g/m² - 75 Etikett(en) (25 Bogen x 3) 8.68 2559675
HERMA Special - Papier - matt - permanent selbstklebend - beschichtet - weiß - 38 x 297 mm - 90 g/m² - 125 Etikett(en) (25 Bogen x 5) 8.68 2568156
Ablageschachtel 15cm, grau. Zur Langzeitlagerung von Hängemappen, 1.62 2568157
Ablageschachtel 20cm, grau. Zur Langzeitlagerung von Hängemappen, 1.93 2627350
OrdnerA4 8cm Pure Glam 2.64 2582799
agipa Ordnerrücken-Etiketten, kurz/ breit, weiß (66000322) 0.79

далее Мы можем добавить фильтры, но это, кажется, уже работает. Так что сосредоточьтесь на текстовом поиске: теперь пользователь вводит в запрос следующую фразу:

ordner 1010 rot

Написанный мною запрос:

                String _ja = "{" + 
                    "    'query': {" + 
                    "        'bool': {" + 
                    "            'must': {" + 
                    "                'multi_match': {" + 
                    "                    'query': '" + safe_input + "'," + 
                    "                    'fields': [" + 
                    "                        'name','artikelNr','ean','description','herstellerNr','hersteller'" +
                    "                    ],'type': 'phrase_prefix', 'tie_breaker': 0.3" + 
                    "                }" + 
                    "            }";
                    if(filter_ids != null) {
                    _ja +="        ,'filter': {";   
                        for(long id : filter_ids) {
                            _ja +="   'term': {" + 
                        "                    'filter': '" + id + "'" + 
                        "                }";
                        }
                        _ja +="            }";  
                    };

                    _ja += "}" + 
                    "    },\n";
                    if(sortby == 1) 
                        _ja += "'sort' : { 'pv_vk_netto': {'order': 'asc'} }";
                    else if(sortby == 2)
                        _ja += "'sort' : { 'pv_vk_netto': {'order': 'desc'} }";
                    else if(sortby == 3)
                        _ja += "'sort' : { 'name': {'order': 'asc'} }";
                    else if(sortby == 4)
                        _ja += "'sort' : { 'name': {'order': 'desc'} }";
                    else
                        _ja += "'sort' : { '_score': {'order': 'desc'} }";                  
                    _ja += "}";
                    _ja = _ja.replaceAll("'", "\"");

Вышеупомянутый запрос работает для поисковая фраза:

order 1010

, но если мы введем в поиск

ordner 1010 rot

, мы не получим никаких результатов. Я полагаю, что я что-то делаю неправильно или я использую неправильный запрос ... :)

По моему мнению, каждый токен в поисковой фразе должен быть символом подстановки. Таким образом, запрос звучит как поиск товаров, в которых в любом поле существует токен ordner , а 1010 существует и rot .

Какие результаты я ожидаю:

Ordner 101050, PP A4 RB 80mm hellrot 180° Ordner Präzisionsmechanik 3.39

на первом месте в списке результатов. Что мне нужно изменить? большое спасибо!

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