Olá galera! Eu estou migrando da linguagem java para node.js… Lá no java eu usava o Apache Lucene para indexação de índices e pesquisas em documentos.
Queria saber a respeito das alternativas index/search para node.js, que sejam parecidas como o Lucene do java, ou principalmente, que aguentam cargas de índices tão altas quanto o Lucene.
Alguma sugestão?
Eu mesmo me respondo. Agora que já aprendi a linguagem NodeJS e tirei minha duvida de index/search… vou compartilhar com quem tiver interesse:
O motor de indexação e busca mais semelhante ao Apache Lucene que eu encontrei e aprendi, é o Search-Index. Para quem tem costume com o Lucene, vai ser moleza aprender esse. Embora, a unica documentação que eu encontrei, foi a do GitHub. É bem pequena, mas simples e direta, como a própria linguagem NodeJS.
Se mais alguém tiver duvida em comparação com o Lucene, basta aprender a configura-lo e fazer os testes. Resumindo, tudo que eu fazia com o Apache Lucene, consegui fazer numa boa com o Search-Index.
Outras alternativas que eu me deparei, foi o Norch, que pelo que eu entendi mudou o nome para Forage.js. Esse eu realmente não consegui entender. Parece que ele é para o Search-Index, o que Solr é para Lucene. Como eu não sei nada de Sorl, então não tenho certeza da minha comparação.
O que eu indico mesmo com alternativa do Apache Lucene do Java, para o NodeJS é o Search-Index.
Acredito que em Node.js você evita esse tipo de tarefa por ser muito mais lento que Java.
pfk66, você disse que em nodejs eu evito esse tipo de tarefa. Qual tipo de tarefa eu estaria evitando?
Node.js é usado em algumas aplicações web porque uma requisição não dura mais que alguns milisegundos. Basicamente é uma tarefa limitada pela capacidade de fazer I/O. Mas em geral, tarefas que são limitadas pela capacidade da CPU disponível (ex: processar dados na memória), Node.js é mais lento que Java/.NET. Acredito que indexação e busca se encaixa na categoria de tarefa limitada pela CPU.
Como foi a performance do search-index em comparação ao Lucene?
Eu fiz uns testes aqui, para indexar esses 8 documentos json, cada um com 1000 objetos:
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-000.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-001.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-002.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-003.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-004.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-005.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-006.json
https://raw.githubusercontent.com/fergiemcdowall/reuters-21578-json/master/data/full/reuters-007.json
O search-index gastou 81119 milisegundos(1 minuto e 21 segundos) para indexar todos os arquivos.
Para efetuar a busca das palavras billion e barrels juntas, onde ele retornou 21 resultados. Gastou 1893 milisegundos. O meu notebook é de 2GB de RAM e 32 bits, o processador é um lixo.
O Lucene eu não testei aqui, pois depois que passei e me adaptei ao NodeJS, eu formatei meu Notebook para remover qualquer dependência do Java. Mas pelo que eu lembro, os resultado foram bem semelhantes.
De qualquer forma, minha conclusão é que o Search-Index, é tão veloz e escalável quanto o Lucene. Acredito que para o NodeJS não deve existir outras alternativas tão eficiente para o Search-Index, tanto é que, quando eu passei para o NodeJS, a primeira coisa que fiz foi olhar se tinha um módulo do Lucene para essa plataforma.
Não tenho o menor interesse em discutir Java vs NodeJS. Essa discussão deve ser SOMENTE SOBRE MOTORES DE INDEXAÇÃO E BUSCAS.
Então Node.js é tão escalável quanto Java em um processador lixo…
Mas e quanto a um processador multicore com suporte a paralelismo, como Node.js escala com apenas uma thread?
olá @pfk66 , bem pelo que pesquisei (corrija-me se estiver errado por favor rs):
NodeJs permite sim processamento paralelo, você pode criar N processos, onde N é o numero de processadores que você possui, num cluster ou cores numa maquina multicore por exemplo, porém cada processo (event loop) só terá uma thread, ou pelo menos nós como programadores veremos somente uma, para cada IO ele na verdade cria uma thread nova (por isso é assincrono) e ai despacha o resultado desse IO quando esta pronto para o evento correto.
Eu usei os seguintes links para pesquisar a pergunta:
blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/
Não estou tomando nenhum dos dois lados rs, eu sou programador JEE a 3 anos e estou começando a aprender sobre NodeJS agora rs.
Se puder acrescentar algo mais, ou me corrigir em algo agradeço !
Valeu !
Just some quick comments, since I know Search-index and Norch a little from the inside (sorry for writing in English, I don’t understand Portuguese, reading it with google translate):
- Norch was renamed to Forage for a while, and then renamed back to Norch. Norch is the search server, based on the search library search-index.
- search-index can run in the browser. This has a couple of advantages: The solution can scale really easy since each user is using the browser as a virtual machine, and fits scenarios where you have small indexes and lots of users. Also, the solution can work offline.