Há um tempo atrás, eu planejava construir um serviço de pesquisa simples para o projeto. Embora o Business Database MongoDB forneça suporte à pesquisa de texto, quando um grande número de documentos precisa ser posicionado através de palavras -chave, o ES é obviamente mais adequado como mecanismo de pesquisa (embora a maioria de nós já tenha usado os recursos de análise e visualização da ELK antes). O Elasticsearch é construído sobre o Lucene e suporta consultas extremamente rápidas e sintaxe de consulta rica e, ocasionalmente, serve como um NOSQL leve. No entanto, a capacidade de complexas operações de consulta e agregação não é muito forte.
Este artigo não mencionará como criar um serviço de pesquisa simples, mas registrará várias armadilhas encontradas durante o horário de trabalho de cerca de uma semana. .
Por que escolher Elasticsearch 5.x?
O novo serviço não tem carga histórica e, em teoria, deve usar o último 6.x. No entanto, o Spring-Data-ELASTICSearch suporta apenas 5.x, e é difícil encapsular diretamente uma camada de APIs, mesmo que o tempo seja apertado. É também porque a versão anterior das coisas de Elk estava confusa, por isso não teve escolha a não ser ir de 2.x para 5.x. Consulte a diferença entre 5.x e 2.x. Simplificando, é espaço em disco -50%, tempo de índice -50%, desempenho da consulta +25%.
Como a Spring-Data-ELASTICSearch deve ser atualizada para 3.0.7, a primavera deve ser atualizada para 2.x, o que leva diretamente às armadilhas que são atingidas mais tarde.
Instalação do Docker es instalará o plug-in X-PATH por padrão
Embora os dados da primavera suportem ES5.x, suas funções não são muito completas. Portanto, se o plug-in x-path for instalado, org.elticsearch.client: x-pack-transport: 5.5.0 precisará ser introduzido. A versão deve ser a mesma da versão ES, e você pode implementar o TransportClient, como segue
@ComPonenPublic Classe esconfig {@Bean Public TransportClient TransportClient () lança desconhecidoHosTexception {TransportClient client = novo prebuiltxpacktransportClient (Settings.builder () .put ("cluster.name", "Docker-cluster"). .AddTransportAddress (New InetSocketTransportAddress (inetAddress.getByName ("0.0.0.0"), 9300)); cliente de retorno; }}Esta também é uma solução mais rápida escolhida, porque não quero ir ao Docker para lidar com o plug-in x-path. Se for desnecessário, não preciso tocar algumas coisas por enquanto.
O MQ salvará as informações da classe da mensagem, fazendo com que o desapego falhe
O RabbitMQ no título nunca foi mencionado, porque é usado apenas como uma fila de mensagens. Quando os dados mudam, o ID da mensagem é jogado no MQ e o consumidor no serviço de pesquisa é consumido.
O problema é que, quando a mensagem é lançada no MQ, ela é encapsulada em seu próprio objeto, que causa a falha do Rabbittemplate.ReceiveAndConvert porque a mensagem transportará as informações do pacote de objetos. Em desespero, o consumidor só pode obter diretamente os bytes da mensagem na fila e converter o formulário JSON em um objeto usando o método ObjecjustMapper.readValue.
A configuração do gradle pode usar -dloader.main para especificar a função de inicialização
É precisamente porque o MQ é introduzido que o serviço de pesquisa precisa iniciar um consumidor. O método é implementar um aplicativo que não inicie o serviço da web e configure um simplemessaGelistEnerContainer e MessagelisteRadapter da seguinte maneira:
@Bean SimpleMessaGelistEnerContainer Container (ConnectionFactory ConnectionFactory, MessagelisteneRatapter ListaRatapter, MQConfig Properties) {SimpleMessaGelistEnerContainer Container = new SimpleMessessAgelisterContainer (); container.setConnectionFactory (ConnectionFactory); container.setQueuenames (Properties.getQueuename ()); container.setMessageListener (ouvinterapapter); recipiente de retorno; } @Bean MessagelistenerAdapter luteRAdApter () {MessagelisteneRadapter luterAdApter = new MessagelisteneRadapter (ItemConsumer, "Consume"); devolver o ouvinte; } O problema é que, quando a configuração do gradle, procurei muito tempo para fazer o pacote JAR criado com o -dloader.main especificado para especificar o aplicativo de inicialização. A solução é a seguinte:
Adicionar arquivo xxx.gradle
bootjar {manifesto {atributos 'classe principal': 'org.springframework.boot.loader.propertieslauncher'}}No projeto Springboot 1.5.9, você precisa especificar o aplicativo de inicialização e precisa adicioná -lo
Springboot {layout = "zip"}A maneira de verificar se é eficaz é descompactar diretamente o pacote JAR após a criação e verificá-lo em xxx (nome do projeto) /meta-info/manifest.mf.
Classe principal: org.springframework.boot.loader.propertieslauncher
Então corrija, se
Classe principal: org.springframework.boot.loader.jarlauncher
A classe inicial no arquivo ainda será iniciada
ES não pode modificar o mapeamento do índice
Como ele simplesmente usa a função de pesquisa de texto do ES, existem muitos resultados de pesquisa insatisfatórios em aplicativos reais, como a pesquisa de "Desk", e é impossível procurar conteúdo como "mesa de computador/mesa de escritório" e outras tabelas XX. Existem muitos casos dessa maneira. Portanto, o dicionário sinônimo é adicionado e o segmento de palavras ik_smart não é usado nos campos que exigem segmentação de palavras, portanto o mapeamento de alguns campos precisa ser alterado para
// analisador é seu próprio nome de segmento de palavras @field (type = fieldtype.text, index = true, analiser = "syncyny") private string descrição;
Como o mapeamento de ES não pode ser modificado, você pode criar manualmente um novo mapeamento e, em seguida, usar o método do reindex para aterrissar os dados (ES5.x vem com API do Reindex). Existe um método on -line através do pseudônimo. Em alguns cenários de modificação, você pode modificar suavemente o mapeamento sem reiniciar/implantar o aplicativo. Você pode consultar e entender os detalhes.
O exposto acima são quase as armadilhas que foram tocadas por um serviço de pesquisa. Vários deles consumiram muito tempo e energia para resolver. Espero que seja de valor de referência para esta lista. No futuro, haverá algumas otimizações no serviço de pesquisa e continuará sendo atualizado lentamente. Eu também espero que todos apoiem mais wulin.com.