Не получается побороть морфологию

Прошу прошения, если вопрос банален, я новичок в работе с ElasticSearch.

Установил версию 7.1 и добавил словари hunspell

Создал индекс с таким анализатором:

			['char_filter' => [
				'ru_mapping' => [
					'type' => 'mapping',
					'mappings' => ['Ё=>Е', 'ё=>е']
				]
			],
			'tokenizer' => [
				'ru_nGram' => [
					'type' => 'nGram',
					'min_gram' => 4,
					'max_gram' => 10
				]
			], 
			'filter' => [
				'ru_stopwords' => [
					'type' => 'stop',
					'stopwords' => 'а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это'
				],
				'en_stopwords' => [
					'type' => 'stop',
					'stopwords' => 'a,an,and,are,as,at,be,but,by,for,if,in,into,is,it,no,not,of,on,or,such,that,the,their,then,there,these,they,this,to,was,will,with'
				],
				'my_nGram' => [
					'type' => 'nGram',
					'min_gram' => 2,
					'max_gram' => 8
				],
				'custom_word_delimiter' => [
					'type' => 'word_delimiter',
					'generate_word_parts' => true,
					'generate_number_parts' => true,
					'catenate_words' => true,
					'catenate_numbers' => false,
					'catenate_all' => true,
					'split_on_case_change' => true,
					'preserve_original' => true,
					'split_on_numerics' => false
				],
				'ru_RU' => [
					'type' => 'hunspell',
					'locale' => 'ru_RU',
					'dedup' => TRUE
				]
			],
			'analyzer' => [
				'ru_index' => [
					'type' => 'custom',
					'tokenizer' => 'standard',
					'char_filter' => ['html_strip', 'ru_mapping'],
					'filter' => ['lowercase', 'custom_word_delimiter', 'en_stopwords', 'ru_stopwords', 'ru_RU']
				]
			]];

сделал такую схему документа:

				['rec__name' => [
						'type' => 'text',
						'analyzer' => 'ru_index',
					],
				'rec__text' => [
						'type' => 'text',
						'analyzer' => 'ru_index',
					]
				];

вношу данные:

		'rec__name'			=> 'Привет ребята!',
		'rec__text'			=> 'Мы хотим в это воскресенье двинуть на пляж, наверное с ночевкой. Давайте с нами! Есть отважные?) ',

пробовал проверять так:

 POST forum.txt/_analyze
 {
   "text": "отважные",
   "analyzer": "ru_index"
 }

возвращает

{
  "tokens" : [
    {
      "token" : "отважный",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

однако, запрос

GET _search
{
  "query": {
    "match": {
      "rec__text" : {
        "query" : "отважный"
      }
    }
  }
}

В результате запрос ничего не возвращает.

Помогите пожалуйста разобраться.

А что analyze выдает если ему задать "Есть отважные?)" в качестве текста и вызвать его по имени поля а не по имени анализатора?

Вот такой запрос:

POST forum.txt/_analyze
{
  "text": "Есть отважные?)",
  "field": "rec__text"
}

Дает такой результат:

{
  "tokens" : [
    {
      "token" : "есть",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "отважные",
      "start_offset" : 5,
      "end_offset" : 13,
      "type" : "<ALPHANUM>",
      "position" : 1
    }
  ]
}

На одно слово "отважные" все равно такой же результат - будто hunspell не используется

Запрос: GET forum.txt/_mappings

Возвращает:

{
  "forum.txt" : {
    "mappings" : {
      "properties" : {
        "rec__name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "rec__text" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Я тут не вижу анализаторов :frowning:

Ура, нашел ошибку. Я mapping документа загружал командой

PUT forum.txt/_mapping
{
      "properties" : {
        "rec__name" : {
          "type" : "text",
          "analyzer" : "ru"
        },
        "rec__text" : {
          "type" : "text",
          "analyzer" : "ru"
        }
      }
}

а надо было

PUT forum.txt/_mappings

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

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

Скорее всего, мэппинг не был правильно загружен при создании первого индекса и поля были добавлены динамически. Поэтому ничего и не работало.

Да я тоже так думаю, только не могу понять почему. Я много раз скрипт перезагружал. Может где-то была опечатка, которую я не замечал, а сейчас случайно затронул.

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