Поиск русских слов не работает


(Petr Sklyarov) #1

Добрый день!
Установил эластиксерч версия 5.6
Плагин морфологический https://github.com/imotov/elasticsearch-analysis-morphology
Использую elasticsearch php библиотеку. Вот код

$client = \Elasticsearch\ClientBuilder::create()->build();
$params = [];
$params['index'] = ES_INDEX;

//Удаляю индекс
if($client->indices()->exists($params)){
$response = $client->indices()->delete($params);
}

//Создаю запись
if(! $client->indices()->exists($params)){

$params = [];
$params = [
    'index' => ES_INDEX,
    'body' => [
        'settings' => [
            'analysis' => [
                'analyzer' => [
                    'ru_analyzer' => [
                        'type' => 'custom',
                        'tokenizer' => 'standard',
                        'filter' => ['lowercase', 'russian_morphology', 'english_morphology', 'snowball', 'ru_stemming']
                    ]
                ],
                'filter' => [
                    'ru_stemming' => [
                        'type' => 'snowball',
                        'language' => 'Russian'
                    ]
                ]
            ]
        ],
        'mappings' => [
            ES_INDEX => [
                'properties' => [
                    'title' => [
                        'type' => 'string',
                        'analyzer' => 'ru_analyzer',
                    ]
                ]
            ]
        ]
    ]
];

$result = $client->indices()->create($params);

}

Далее индексирую данные

$params = [];
$params['index'] = ES_INDEX;
$params['type']  = ES_TYPE;
$params['id'] = 1;
$params['body']['title'] = 'Тестовая метка;
$params['body']['location'] = [
    'lat' => 50.1001,
    'lon' => 25.1002
];
$result = $client->index($params);

Данные заносятся в эластик - если искать по ID - запись вернется, но если начать искать по тексту:

$params = [];
$params['index'] = ES_INDEX;
if ($client->indices()->exists($params)) {
$params['type'] = ES_TYPE;
$params['size'] = 10000;
$params['body']['sort'] = ['_score' => 'desc'];
$params['body']['query']['match']['title'] = 'тест';
$result = $client->search($params);
}

то ничего не находит

Array
(
[took] => 0
[timed_out] =>
[_shards] => Array
(
[total] => 5
[successful] => 5
[skipped] => 0
[failed] => 0
)

[hits] => Array
    (
        [total] => 0
        [max_score] => 
        [hits] => Array
            (
            )
    )

)

Пожалуйста, подскажите, что я делаю не так


(Igor Motov) #2

Мне очень интересно, где вы вот это нашли:

'lowercase', 'russian_morphology', 'english_morphology', 'snowball', 'ru_stemming'

Это неправильный подход, который я уже несколько раз видел, и очень хотел бы задавить в первоисточнике.


(Petr Sklyarov) #3

Это я в нескольких разных местах видел.... Но я понял что у меня было. На самом деле все работало, но я писал все в одном скрипте. Данные после индексации не успевали походу в еластике зписаться. Решилась проблемма написанием sleep(10) перед поиском :slight_smile:
Спасибо!


(Igor Motov) #4

https://www.elastic.co/guide/en/elasticsearch/reference/6.0/docs-refresh.html


#5

Подскажите, а что тут не так ?
Сам использую

['min_length_2', 'stop', 'lowercase', 'russian_morphology', 'english_morphology']

где

'min_length_2' => [
 'type' => 'length',
 'min' => 2
],
'stop' => [
 'type' => 'stop',
 'stopwords' => '_russian_'
]

(Igor Motov) #6

"Не так" для чего?


#7

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


(Igor Motov) #8

Я написал, что неправильно применять несколько стеммеров для одного и того же языка. Например, в ['lowercase', 'russian_morphology', 'english_morphology', 'snowball', 'ru_stemming'] два русских стеммера ( 'russian_morphology' и 'ru_stemming' ) и два английских ('english_morphology', 'snowball'). Применять второй стеммер к базовым формам полученным из первого стеммера бесполезно. В вашем случае, только два стеммера - один для русского и другой для английского.


(system) #9

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.