Некоторое время назад я планировал создать простую поисковую службу для проекта. Хотя бизнес -база данных MongoDB обеспечивает поддержку текстового поиска, когда большое количество документов должно быть расположено с помощью ключевых слов, ES, очевидно, более подходит в качестве поисковой системы (хотя большинство из нас использовали анализ и визуализацию ELK ранее). Elasticsearch построен на Lucene и поддерживает чрезвычайно быстрые запросы и богатый синтаксис запросов, а иногда служит легким NOSQL. Тем не менее, способность к сложным операциям запросов и агрегации не очень сильна.
В этой статье не будет упоминаться, как создать простую поисковую службу, но будет записывать несколько ошибок, встречающихся в рабочее время около недели. Полем
Почему выбирают Elasticsearch 5.x?
Новая служба не имеет исторического бремени, и теоретически она должна использовать последнюю 6.x. Тем не менее, Spring-Data-Elasticsearch только поддерживает 5.x, и трудно напрямую инкапсулировать слой API, даже если время напряженно. Это также потому, что предыдущая версия вещей Элка была запутана, поэтому у него не было выбора, кроме как перейти с 2.x до 5.x. Запросите разницу между 5.x и 2.x. Проще говоря, это дисковое пространство -50%, индексное время -50%, производительность запроса +25%.
Поскольку Spring-Data-Elasticsearch должен быть обновлен до 3,0,7, пружина должна быть обновлена до 2.x, что непосредственно приводит к ловушкам, которые поражены позже.
Docker Installation ES будет установить плагин X-Path по умолчанию
Хотя Spring-Data поддерживает ES5.x, его функции не очень полны. Следовательно, если установлен плагин X-Path, org.elasticsearch.client: X-Pack-Transport: 5.5.0 должен быть введен. Версия должна быть такой же, как и версия ES, и вы можете реализовать TransportClient самостоятельно следующим образом
@Componentpublic class esconfig {@bean public TransportClient TransportClient () бросает неизвестное hostexception {transportclient client = new prebuiltxpacktransportclient (settings.builder () .put ("cluster.name", "docker-cluster") .put (xpack.security.user "," Elastice "). .AddTransportAddress (New InetSocketTransPortAddress (inetAddress.getByName ("0,0.0.0"), 9300)); вернуть клиент; }}Это также более быстрое решение, выбранное потому, что я не хочу ходить в Docker, чтобы справиться с плагином X-Path. Если это ненужно, мне не нужно касаться некоторых вещей в самих эс.
MQ сохранит информацию о классе сообщений, заставляя десериализован
Rabbitmq в заголовке никогда не упоминался, потому что он просто используется в качестве очереди сообщений. Когда данные меняются, идентификатор сообщения добавляется в MQ, а потребитель в службе поиска потребляется.
Проблема заключается в том, что когда сообщение брошено в MQ, оно инкапсулируется в свой собственный объект, который приводит к тому, что Rabbittemplate.receiveAndConvert не удастся, поскольку сообщение будет нести информацию о пакете объекта. В отчаянии потребитель может напрямую получить байты сообщения в очереди и преобразовать форму JSON в объект, используя метод ObjectMapper.ReadValue.
Конфигурация Gradle может использовать -dloader.main для указания функции запуска
Это именно потому, что MQ представлен, что поисковая служба должна запустить потребителя. Метод состоит в том, чтобы внедрить приложение, которое не запускает веб -сервис, и настроить SimpleMessageListenerContainer и MessageListenerEdapter следующим образом:
@Bean SommereMessageListenErcontainer Container (ConnectionFactory ConnectionFactory, MessagelistenerAdapter прослушивание Container.SetConnectionFactory (ConnectionFactory); Container.SetQueUenames (Properties.getQueUename ()); Container.SetMessAgeListener (прослушивание); вернуть контейнер; } @Bean messageListenerAdapter listenerAdapter () {messageListenerAdapter hellockerAdapter = new MessageListenerAdapter (itemConsumer, "потребление"); вернуть прослушивание } Проблема заключается в том, что при конфигурации Gradle я давно искал, чтобы сделать пакет JAR, созданный с указанным -dloader.main для указания приложения запуска. Решение заключается в следующем:
Добавить в файле xxx.gradle
bootjar {manifest {атрибуты 'Main Class': 'org.springframework.boot.loader.propertieslauncher'}}В проекте Springboot 1.5.9 вам необходимо указать приложение запуска и необходимо добавить его
Springboot {layout = "Zip"}Способ проверить, является ли он эффективным, заключается в том, чтобы напрямую разкапливаться в пакете JAR после строительства и проверить его в xxx (имя проекта) /мета-info/manifest.mf.
Основной класс: org.springframework.boot.loader.propertieslauncher
Тогда правильно, если
Основной класс: org.springframework.boot.loader.jarlauncher
Start Class в файле все еще будет запущен
ES не может изменить картирование индекса
Поскольку он просто использует функцию текстового поиска ES, существует много неудовлетворительных результатов поиска в реальных приложениях, таких как поиск «стола», и невозможно искать контент, такой как «компьютерный стол/офисный стол» и другие таблицы XX. Таким образом, есть много случаев. Поэтому добавляется словарь синонимов, и сегментатор слов IK_SMART не используется на полях, которые требуют сегментации слова, поэтому отображение некоторых полей необходимо изменить на
// Analyzer - это собственное имя сегментации слов @Field (type = fieldtype.text, index = true, analyzer = "synconym") частная строка описание;
Поскольку отображение ES не может быть изменено, вы можете только вручную создавать новое отображение, а затем использовать метод Reindex для обратной засыпки данных (ES5.x поставляется с API Reindex). Есть метод онлайн через псевдоним. В некоторых сценариях модификации вы можете плавно изменять отображение без перезапуска/развертывания приложения. Вы можете запрашивать и понять подробности.
Вышеуказанное - это почти ловушки, которые были затронуты поисковой службой. Некоторые из них потребляли много времени и энергии для решения. Я надеюсь, что это будет иметь справочное значение для этого списка. В будущем в поисковой службе будет некоторая оптимизация и будет продолжаться медленно. Я также надеюсь, что все будут поддерживать Wulin.com больше.