Объединение 3 анализаторов в 1

Добрый день, есть цель объединить 3 анализатора в 1 для будущих индексов, я с этим не сталкивался в процессе работы да и с эластиком в принципе то же редко, по идее у меня цель 3 анализатора.
Может кто поможет с этим делом, я все ломаю или вообще не правильно склеиваю, все 3 анализатора ниже

Приравниваем е/ё

curl -X PUT http://localhost:9200/test_e
PUT test_e
{
  "settings": {
    "analysis": {
      "filter": {
        "ru_stop": {
          "type": "stop",
          "stopwords": "_russian_"
        },
        "ru_stemmer": {
          "type": "stemmer",
          "language": "russian"
        }
      },
      "char_filter": {
        "e_char_filter": {
          "type": "mapping",
          "mappings": [ "Ё => Е", "ё => е" ]
        }
      },
      "analyzer": {
        "e_ru": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "ru_stop",
            "ru_stemmer"
          ],
          "char_filter": ["e_char_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "fairytale": {
        "type": "text",
        "analyzer": "e_ru"
        }
      }
    }
}

Точка разделитель

PUT my-dot
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_dot_analyzer": {
          "type":      "pattern",
          "pattern":   "\\.", 
          "lowercase": true
        }
      }
    }
  }
}

Это сделать нельзя, так как в анализаторе только один токенизатор, но можно выбрать общий токенизатор и обьединить токен-фильтры в один анализатор. Что вы хотите добиться-то?

итоговая цель, при поисковом запросе
1)что бы е/ё были 1 символом
2)точка была разделителем
3)дублирующая информация в одном документе удалялась после 1го вхождения

Я думал это все анализаторами делается и их обьединением.

Это не цель. Вы описываете решение, которое вы пытаетесь воплотить. Мне сложно приставить какую проблему вы пытаетесь решить с помощью этого набора мер. Особенно меня смущает 3). Можно, как-нибудь, на примерах пояснить какие документы и запросы должны совпадать?

1)Думаю логично е и ё однин символ при поисковом запросе Еж или Ёж одно и то же
2)"Город Москва, красивый.город Москва" при поисковом запросы вывод что бы получался первая часть Город Москва,красивый вторая часть город Москва
3)"Город Москва, красивый.город Москва" вывод должен получаться Город, красивый.город Москва
А все объединить что бы в итоговом варианте получалось + е/ё
первый вывод "Город, красивый"
второй вывод "город Москва"

Нафига оно надо не могу сказать, попросили сделать, по отдельности сделал, кроме последнего пункта, а как объединить хз.
Просили это -

  • Чувствительность поиска к Ё (считаем, Е и Ё одним символом): добавить к анализатору приравнивание Е к Ё и е к ё
  • Отсутствие пробелов между типом и названием АО - Сделать точку разделителем в поисковом анализаторе
  • повторяющиеся названия уровней (удаляем первое повторение): дополнительный сервис-прослойка на задваивающиеся элементы строки

Что такое вывод? Я думал мы про поиск говорим. При поиске мы находим все запись. Мы про подсветку тут говорим, если да, то для какой поисковой фразы?

про поиск (это я так назвал вывод), что бы при поиске работали эти 3 анализаторы.

Я все-равно не понимаю, зачем вам это:

Без этого все работает:

DELETE test

PUT test
{
  "settings": {
    "analysis": {
      "filter": {
        "ru_stop": {
          "type": "stop",
          "stopwords": "_russian_"
        },
        "ru_stemmer": {
          "type": "stemmer",
          "language": "russian"
        }
      },
      "char_filter": {
        "e_char_filter": {
          "type": "mapping",
          "mappings": [
            "Ё => Е",
            "ё => е",
            ". => ,"
          ]
        }
      },
      "analyzer": {
        "e_ru": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "ru_stop",
            "ru_stemmer"
          ],
          "char_filter": [
            "e_char_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "fairytale": {
        "type": "text",
        "analyzer": "e_ru"
      }
    }
  }
}

POST test/_bulk?refresh
{"index": {"_id":"1"}}
{"fairytale": "Город Москва, красивый.город Москва и Ёж"}

POST test/_search
{
  "query": {
    "match": {
      "fairytale": "еж"
    }
  }
}

POST test/_search
{
  "query": {
    "match": {
      "fairytale": "красивый"
    }
  }
}

Тут наверно мои знания синтаксиса эластика заканчиваются, а для чего стоит замена точки на запятую.
в этом анализаторе работает только Е/ё ,а ведь цель еще добавить к анализу разделитель слов - точку и отсутствие дублей слов в выводе

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

Зачем?

Как я уже писал , это попросили сделать меня, для чего это все хз.
А мой вараинт с точкой не пройдет? И удаление дублей видимо о же нужно, я не находил такого решения сам.

PUT my-dot
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_dot_analyzer": {
          "type":      "pattern",
          "pattern":   "\\.", 
          "lowercase": true
        }
      }
    }
  }
}

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

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

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