Comparação de mecanismo de pesquisa de texto completo - Lucene, Sphinx, Postgresql, MySQL?

312

Estou construindo um site Django e estou procurando um mecanismo de pesquisa.

Alguns candidatos:

  • Lucene / Lucene com Bússola / Solr

  • Esfinge

  • Pesquisa de texto completo do Postgresql

  • Pesquisa de texto completo do MySQl

Critério de seleção:

  • relevância e classificação do resultado
  • velocidade de pesquisa e indexação
  • facilidade de uso e facilidade de integração com o Django
  • requisitos de recursos - o site será hospedado em um VPS , portanto, idealmente, o mecanismo de pesquisa não exigiria muita memória RAM e CPU
  • escalabilidade
  • recursos extras, como "você quis dizer?", pesquisas relacionadas etc.

Qualquer pessoa que tenha experiência com os mecanismos de pesquisa acima ou com outros mecanismos que não estão na lista - eu adoraria ouvir suas opiniões.

EDIT: Quanto às necessidades de indexação, à medida que os usuários continuam inserindo dados no site, esses dados precisam ser indexados continuamente. Ele não precisa ser em tempo real, mas o ideal é que novos dados sejam exibidos no índice com um atraso de mais de 15 a 30 minutos

Continuação
fonte
26
2 ¢: a pesquisa e as transações de texto completo do MySQL são (atualmente) mutuamente exclusivas. Os índices de texto completo do MySQL requerem o tipo de tabela MyISAM, que não suporta transações. (Ao contrário do tipo de tabela InnoDB que suporta transações, mas não índices de texto completo.)
Carl G
2
A pesquisa de texto completo do PostgreSQL, Tsearch não suporta a pesquisa de frases. No entanto, está na lista TODO sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam
1
Qualquer pessoa que veja isso no Django deve fazer o checkout do aplicativo palheiro. haystacksearch.org
Keyo
24
@CarlG, apenas para referência de todos. O MySQL 5.6+ tem suporte à pesquisa de texto completo com o mecanismo innodb
DhruvPathak

Respostas:

167

É bom ver que alguém falou sobre Lucene - porque não faço ideia disso.

Esfinge, por outro lado, eu sei muito bem, então vamos ver se posso ajudar.

  • A classificação da relevância do resultado é o padrão. Você pode configurar sua própria classificação, se desejar, e atribuir pesos específicos a campos específicos.
  • A velocidade de indexação é super rápida, porque fala diretamente com o banco de dados. Qualquer lentidão virá de consultas SQL complexas, chaves estrangeiras não indexadas e outros problemas desse tipo. Também nunca notei nenhuma lentidão na busca.
  • Eu sou um cara do Rails, então não tenho idéia de como é fácil implementar com o Django. Existe uma API Python que vem com a fonte Sphinx.
  • O daemon do serviço de pesquisa (searchd) é muito baixo no uso de memória - e você pode definir limites de quanta memória o processo do indexador também usa.
  • A escalabilidade é onde meu conhecimento é mais superficial - mas é fácil o suficiente copiar arquivos de índice para várias máquinas e executar vários daemons de pesquisa. A impressão geral que tenho de outras pessoas é que ela é muito boa sob alta carga, portanto, escalá-la em várias máquinas não é algo que precise ser tratado.
  • Não há suporte para 'você quis dizer', etc - embora isso possa ser feito com outras ferramentas com bastante facilidade. O Sphinx provém palavras usando o uso de dicionários; portanto, 'dirigir' e 'dirigir' (por exemplo) seriam considerados os mesmos nas pesquisas.
  • O Sphinx não permite atualizações parciais de índice para dados de campo. A abordagem comum para isso é manter um índice delta com todas as alterações recentes e reindexá-lo após cada alteração (e esses novos resultados aparecerão em um ou dois segundos). Devido à pequena quantidade de dados, isso pode levar alguns segundos. Você ainda precisará reindexar o conjunto de dados principal regularmente (embora a frequência com que dependa da volatilidade de seus dados - todos os dias? A cada hora?). As rápidas velocidades de indexação mantêm tudo isso bastante indolor.

Não tenho ideia de como isso é aplicável à sua situação, mas Evan Weaver comparou algumas das opções comuns de pesquisa do Rails (Sphinx, Ferret (um porto de Lucene para Ruby) e Solr), executando alguns benchmarks. Poderia ser útil, eu acho.

Não mergulhei nas profundezas da pesquisa de texto completo do MySQL, mas sei que ele não compete em termos de velocidade nem de recursos com Sphinx, Lucene ou Solr.

tapinha
fonte
O Sphinx permite atualizar atributos individuais de itens nos índices atuais, mas não remover / atualizar registros completos.
Xorlev
O sphinx RT permite que você faça atualizações / remoções parciais. está em estágio inicial, mas já [quase] funciona. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
PQD
4
Aqui está uma resposta em Solr que é um bom par para esta resposta em Sphinx
New Alexandria
Nada pode corresponder à velocidade da Esfinge; portanto, se a velocidade é a sua preocupação número um, então a Esfinge é a opção ideal. Bom post
twigg
O Sphinx 2.3.2 Beta agora tem um recurso chamado 'SUGESTÃO DE CHAMADA', que pode ser usado para implementar 'você quis dizer?' sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K
82

Não conheço o Sphinx, mas, quanto ao Lucene versus uma pesquisa de texto completo no banco de dados, acho que o desempenho do Lucene é incomparável. Você deve conseguir fazer quase qualquer pesquisa em menos de 10 ms, não importa quantos registros você precise pesquisar, desde que você tenha configurado seu índice Lucene corretamente.

Aí vem o maior obstáculo: pessoalmente, acho que integrar o Lucene no seu projeto não é fácil . Claro, não é muito difícil configurá-lo para que você possa fazer uma pesquisa básica, mas se quiser tirar o máximo proveito disso, com desempenho ideal, então definitivamente precisará de um bom livro sobre Lucene.

Quanto aos requisitos de CPU e RAM, realizar uma pesquisa no Lucene não sobrecarrega muito sua CPU, embora a indexação de seus dados ocorra, embora você não faça isso com muita frequência (talvez uma ou duas vezes por dia), de modo que isso não é possível. um grande obstáculo.

Ele não responde a todas as suas perguntas, mas, resumindo, se você tem muitos dados para pesquisar e deseja um ótimo desempenho, acho que o Lucene é definitivamente o caminho a percorrer. Se você não tiver tantos dados para pesquisar, é melhor fazer uma pesquisa de texto completo no banco de dados. Configurar uma pesquisa de texto completo no MySQL é definitivamente mais fácil no meu livro.

Razzie
fonte
10
Comparada à esfinge, a lucência é muito lenta e volumosa. Eu tinha usado tanto no meu projeto e finalmente aderi à esfinge. O Lucence está em java e é necessário muito mais CPU e RAM que o Sphinx.
Phyo Arkar Lwin
25
Eu tenho que discordar aqui. Lucene é muito rápido se você criar um índice correto. Basicamente, você pode fazer uma consulta avançada em milhões de registros em apenas alguns milissegundos. Você só precisa saber o que está fazendo. E Lucene está em java ... o que você quer dizer? Há também a porta .NET, Lucene.NET btw.
Razzie
15
mas você afirmou claramente que não usa esfinge e o v3sson usou os dois.
user508546
20
como você pode afirmar que o desempenho de lucene é incomparável na mesma frase que você afirma que não usou esfinge?
user508546
22
Perguntas válidas. Eu nunca disse que o Lucene é mais rápido que o Sphinx, mencionei que o Lucene versus uma pesquisa de texto completo no banco de dados é incomparável. E isso é. Nenhuma pergunta sobre isso. Lucene é baseado em um índice invertido. Agora não conheço o Sphinx, como mencionado anteriormente, mas se ele também usa um índice invertido ou um método de indexação semelhante, é possível que eles estejam executando igualmente. Afirmar que Lucene, comparado à Esfinge, seria "muito lento e volumoso" não se baseia em fatos. Especialmente quando se diz apenas que o Lucene está em 'Java', o que é apenas uma questão não ridícula em termos de desempenho.
Razzie
60

Estou surpreso que não haja mais informações publicadas sobre o Solr. O Solr é bastante semelhante ao Sphinx, mas possui recursos mais avançados (o AFAIK, como eu não usei o Sphinx - apenas li sobre ele).

A resposta no link abaixo detalha algumas coisas sobre o Sphinx, que também se aplicam ao Solr. Comparação de mecanismo de pesquisa de texto completo - Lucene, Sphinx, Postgresql, MySQL?

O Solr também fornece os seguintes recursos adicionais:

  1. Suporta replicação
  2. Múltiplos núcleos (pense neles como bancos de dados separados com sua própria configuração e índices)
  3. Pesquisas booleanas
  4. Destaque de palavras-chave (bastante fácil de fazer no código do aplicativo se você tiver regex-fu; no entanto, por que não deixar uma ferramenta especializada fazer um trabalho melhor para você)
  5. Atualizar índice via XML ou arquivo delimitado
  6. Comunique-se com o servidor de pesquisa via HTTP (ele pode até retornar Json, PHP nativo / Ruby / Python)
  7. Indexação de documentos PDF, Word
  8. Campos dinâmicos
  9. Facetas
  10. Campos agregados
  11. Interromper palavras, sinônimos, etc.
  12. Mais como isso...
  13. Indexar diretamente do banco de dados com consultas personalizadas
  14. Sugestão automática
  15. Aquecimento automático de cache
  16. Indexação rápida (compare com os tempos de indexação da pesquisa de texto completo do MySQL) - Lucene usa um formato de índice binário invertido.
  17. Reforço (regras personalizadas para aumentar a relevância de uma determinada palavra-chave ou frase, etc.)
  18. Pesquisas em campo (se um usuário de pesquisa conhece o campo que deseja pesquisar, ele restringe sua pesquisa digitando o campo, o valor e APENAS esse campo é pesquisado em vez de tudo - experiência do usuário muito melhor)

BTW, existem muitos outros recursos; no entanto, listei apenas os recursos que realmente usei na produção. BTW, fora da caixa, o MySQL suporta # 1, # 3 e # 11 (limitado) na lista acima. Para os recursos que você procura, um banco de dados relacional não é suficiente. Eu os eliminaria imediatamente.

Além disso, outro benefício é que o Solr (na verdade, o Lucene) é um banco de dados de documentos (por exemplo, NoSQL), e muitos dos benefícios de qualquer outro banco de dados de documentos podem ser obtidos com o Solr. Em outras palavras, você pode usá-lo para mais do que apenas pesquisar (ou seja, Desempenho). Seja criativo com isso :)

Wil Moore III
fonte
Esfinge também sobre Suporta replicação Múltiplos núcleos Pesquisas booleanas Destaque de palavras-chave Atualizar índice via XML - ou arquivo delimitado - PDF, indexação de documentos do Word (via xml) Facetas Interrompe palavras, sinônimos etc. Indexa diretamente do banco de dados com consultas personalizadas Sugestão automática indexação impulsionar pesquisas em campo Sobre dinâmico campos Aggregate campos cache Autowarming Eu só não sei
Moosh
58

Apache Solr


Além de responder às perguntas do OP, deixe-me apresentar algumas idéias sobre o Apache Solr, da introdução simples à instalação e implementação detalhadas .

Introdução Simples


Qualquer pessoa que tenha experiência com os mecanismos de pesquisa acima ou com outros mecanismos que não estão na lista - eu adoraria ouvir suas opiniões.

Solr não deve ser usado para resolver problemas em tempo real. Para os mecanismos de busca, o Solr é praticamente um jogo e funciona perfeitamente .

O Solr funciona bem em aplicativos da Web de alto tráfego ( li em algum lugar que não é adequado para isso, mas estou fazendo o backup dessa declaração ). Ele utiliza a RAM, não a CPU.

  • relevância e classificação do resultado

O impulso ajuda a classificar seus resultados no topo. Digamos que você esteja tentando procurar um nome john nos campos firstname e lastname , e queira dar relevância ao campo firstname , depois precisará aumentar o campo firstname como mostrado.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Como você pode ver, o campo de nome é aumentado com uma pontuação de 2.

Mais sobre SolrRelevancy

  • velocidade de pesquisa e indexação

A velocidade é incrivelmente rápida e sem comprometer isso. A razão pela qual me mudei para Solr .

Em relação à velocidade de indexação, o Solr também pode manipular JOINS a partir de suas tabelas de banco de dados. Um JOIN mais alto e complexo afeta a velocidade da indexação. No entanto, uma enorme configuração de RAM pode facilmente lidar com essa situação.

Quanto maior a RAM, maior a velocidade de indexação do Solr.

  • facilidade de uso e facilidade de integração com o Django

Nunca tentei integrar o Solr e o Django , no entanto, você pode fazer isso com o Haystack . Encontrei algum artigo interessante sobre o mesmo e aqui está o github .

  • requisitos de recursos - o site será hospedado em um VPS, portanto, idealmente, o mecanismo de pesquisa não exigiria muita memória RAM e CPU

O Solr gera na RAM; portanto, se a RAM é alta, você não precisa se preocupar com o Solr. .

O uso de RAM do Solr dispara na indexação completa, se você tiver alguns bilhões de registros, poderá usar as importações da Delta de maneira inteligente para lidar com essa situação. Como explicado, o Solr é apenas uma solução quase em tempo real .

  • escalabilidade

O Solr é altamente escalável. Dê uma olhada no SolrCloud . Algumas características principais.

  • Shards (ou sharding é o conceito de distribuir o índice entre várias máquinas, por exemplo, se o seu índice cresceu muito)
  • Balanceamento de carga (se o Solrj for usado com a nuvem Solr, ele cuida automaticamente do balanceamento de carga usando o mecanismo Round-Robin)
  • Pesquisa Distribuída
  • Alta disponibilidade
  • recursos extras, como "você quis dizer?", pesquisas relacionadas etc.

Para o cenário acima, você pode usar o SpellCheckComponent que acompanha o Solr . Existem muitos outros recursos, o SnowballPorterFilterFactory ajuda a recuperar registros, digamos que, se você digitou livros , em vez de livro , você verá os resultados relacionados ao livro .


Esta resposta se concentra amplamente no Apache Solr e MySQL . O Django está fora do escopo.

Supondo que você esteja no ambiente LINUX, continue com este artigo. (o meu era uma versão do Ubuntu 14.04)

Instalação detalhada

Começando

Baixar Apache Solr a partir daqui . Essa seria a versão é 4.8.1 . Você pode baixar novas versões, eu achei isso estável.

Depois de baixar o arquivo, extraia-o para uma pasta de sua escolha. Diga .. Downloadsou o que seja .. Então vai parecerDownloads/solr-4.8.1/

No seu prompt. Navegue dentro do diretório

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Então agora você está aqui ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Inicie o servidor de aplicativos Jetty

O Jetty está disponível dentro da pasta de exemplos do solr-4.8.1diretório, então navegue dentro dele e inicie o Jetty Application Server.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

Agora, não feche o terminal, minimize-o e deixe-o de lado.

(DICA: Use & após start.jar para fazer o Jetty Server ser executado em segundo plano)

Para verificar se o Apache Solr é executado com êxito, visite este URL no navegador.http: // localhost: 8983 / solr

Executando o Jetty na porta personalizada

É executado na porta 8983 como padrão. Você pode alterar a porta aqui ou diretamente dentro do jetty.xmlarquivo.

java -Djetty.port=9091 -jar start.jar

Faça o download do JConnector

Esse arquivo JAR atua como uma ponte entre MySQL e JDBC, faça o download da versão independente da plataforma aqui

Após o download, extraia a pasta, copie mysql-connector-java-5.1.31-bin.jare cole no diretório lib .

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Criando a tabela MySQL para ser vinculada ao Apache Solr

Para usar o Solr , é necessário ter algumas tabelas e dados para pesquisar. Para isso, usaremos o MySQL para criar uma tabela e enviar alguns nomes aleatórios e, em seguida, poderíamos usar o Solr para conectar-se ao MySQL. e indexar essa tabela e suas entradas.

1. estrutura da tabela

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. preencha a tabela acima

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

Entrando no núcleo e adicionando as diretivas da lib

1. Navegue para

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.Modificando o solrconfig.xml

Adicione essas duas diretivas a esse arquivo.

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Agora adicione o DIH (Data Import Handler)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.Crie o arquivo db-data-config.xml

Se o arquivo existir, então ignore, adicione essas linhas a esse arquivo. Como você pode ver na primeira linha, você precisa fornecer as credenciais do seu banco de dados MySQL . O nome do banco de dados, nome de usuário e senha.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(DICA: você pode ter qualquer número de entidades, mas cuidado com o campo id, se elas forem iguais, a indexação será ignorada.)

4.Modifique o arquivo schema.xml

Adicione isso ao seu schema.xml, como mostrado ..

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Implementação

Indexação

É aqui que está o verdadeiro negócio. Você precisa fazer a indexação dos dados do MySQL para o Solr para fazer uso das consultas do Solr.

Etapa 1: vá para o Painel de administração do Solr

Clique no URL http: // localhost: 8983 / solr no seu navegador. A tela abre assim.

Este é o principal painel de administração do Apache Solr

Como o marcador indica, acesse Logon inorder para verificar se alguma das configurações acima levou a erros.

Etapa 2: verifique seus logs

Ok, agora você está aqui. Como você pode, existem muitas mensagens amarelas (AVISOS). Verifique se você não possui mensagens de erro marcadas em vermelho. Anteriormente, em nossa configuração, adicionamos uma consulta de seleção em nosso db-data-config.xml , digamos que se houvesse algum erro nessa consulta, ela seria exibida aqui.

Esta é a seção de registro do seu mecanismo Apache Solr

Tudo bem, sem erros. Estamos prontos para ir. Vamos escolher collection1 da lista como representada e selecionar Dataimport

Etapa 3: DIH (manipulador de importação de dados)

Usando o DIH, você se conectará ao MySQL do Solr através do arquivo de configuração db-data-config.xml da interface do Solr e recuperará os 10 registros do banco de dados indexado no Solr .

Para fazer isso, escolha a importação completa e marque as opções Limpar e confirmar . Agora clique em Executar como mostrado.

Como alternativa, você também pode usar uma consulta direta de importação completa como essa.

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

O manipulador de importação de dados

Depois que você clica em Executar , o Solr começa a indexar os registros, se houver algum erro, ele indicaria Falha na indexação e você precisará voltar à seção Log para ver o que deu errado.

Supondo que não haja erros nessa configuração e se a indexação for concluída com êxito., Você receberá esta notificação.

Sucesso na indexação

Etapa 4: executando consultas Solr

Parece que tudo correu bem, agora você pode usar as consultas do Solr para consultar os dados que foram indexados. Clique na consulta à esquerda e pressione Executar botão na parte inferior.

Você verá os registros indexados, como mostrado.

A consulta Solr correspondente para listar todos os registros é

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

Os dados indexados

Bem, lá estão todos os 10 registros indexados. Digamos, precisamos apenas de nomes começando com Ja ; nesse caso, você precisa segmentar o nome da coluna solr_name; portanto, sua consulta é assim.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Os dados JSON começando com Ja *

É assim que você escreve as consultas do Solr . Para ler mais sobre isso, confira este belo artigo .

Shankar Damodaran
fonte
3
@Downvoter, fique à vontade para comentar ou editar esta resposta, e o raciocínio para o voto negativo também ajudará outras pessoas.
Shankar Damodaran
4
esse é um dos posts mais abrangentes e bem organizados que eu já vi no SO. Trabalho incrível.
degenerado
28

Estou analisando a pesquisa de texto completo do PostgreSQL no momento e ela possui todos os recursos corretos de um mecanismo de pesquisa moderno, caracteres estendidos realmente bons e suporte multilíngue, boa integração com campos de texto no banco de dados.

Mas ele não possui operadores de pesquisa fáceis de usar como + ou AND (usa & |!) E não estou entusiasmado com a forma como funciona no site de documentação. Embora tenha negrito dos termos de correspondência nos snippets de resultados, o algoritmo padrão para o qual os termos de correspondência não são bons. Além disso, se você deseja indexar rtf, PDF, MS Office, você precisa encontrar e integrar um conversor de formato de arquivo.

OTOH, é muito melhor do que a pesquisa de texto do MySQL, que nem sequer indexa palavras de três letras ou menos. É o padrão para a pesquisa MediaWiki, e realmente acho que não é bom para os usuários finais: http://www.searchtools.com/analysis/mediawiki-search/

Em todos os casos que vi, Lucene / Solr e Sphinx são realmente ótimas . Eles são um código sólido e evoluíram com melhorias significativas na usabilidade, portanto, as ferramentas estão lá para criar uma pesquisa que satisfaça quase todo mundo.

para SHAILI - SOLR inclui a biblioteca de códigos de pesquisa Lucene e possui os componentes para ser um bom mecanismo de pesquisa independente.

Ferramentas de Pesquisa-Avi
fonte
1
Eu acredito que pela pesquisa de texto completo do PostgreSQL você está se referindo Tsearch. Mas o Tsearch não suporta a pesquisa de frases. Ainda está na lista TODO deles sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam
1
Acabei de fazer vários testes na pesquisa de texto completo do Postgres 9.0; ficou desapontado ao descobrir que o texto em francês não é correspondido se o usuário esquecer de obter todos os sotaques corretos. A correspondência das formas das palavras é irregular - por exemplo, em inglês "say" não corresponde ao texto que contém "said". No geral, bastante impressionante para um recurso integrado nos idiomas testados (en, fr, ru).
Roman Starkov
9
@romkyns: você precisa instalar um dicionário não-acentuado para removê-los.
Denis de Bernardy
2
"OTOH, é muito melhor do que a pesquisa de texto do MySQL, que nem sequer indexa palavras de três letras ou menos." Isso não é uma restrição interna do MySQL - é o que você definir no arquivo de configuração. Se você deseja indexar palavras de uma letra, basta alterar um valor na configuração.
quer
1
É preocupante que as pessoas estejam comparando bancos de dados que ainda não foram totalmente explorados. O MySQL PODE indexar palavras com três caracteres ou menos - você apenas precisa configurá-lo corretamente.
TheCarver
22

Apenas meus dois centavos para esta pergunta muito antiga. Eu recomendo dar uma olhada no ElasticSearch .

O Elasticsearch é um servidor de pesquisa baseado no Lucene. Ele fornece um mecanismo de pesquisa de texto completo distribuído e com capacidade para vários operadores, com uma interface da Web RESTful e documentos JSON sem esquema. O Elasticsearch é desenvolvido em Java e é lançado como código aberto sob os termos da Licença Apache.

As vantagens sobre outros mecanismos de STF (pesquisa de texto completo) são:

  • Interface RESTful
  • Melhor escalabilidade
  • Grande comunidade
  • Construído por desenvolvedores Lucene
  • Documentação extensa
  • Existem muitas bibliotecas de código aberto disponíveis (incluindo Django)

Estamos usando esse mecanismo de pesquisa em nosso projeto e estamos muito felizes com ele.

vooD
fonte
10

O SearchTools-Avi disse "Pesquisa de texto no MySQL, que nem sequer indexa palavras de três letras ou menos".

Para sua informação, o comprimento mínimo da palavra em texto completo do MySQL é ajustável desde pelo menos o MySQL 5.0. Google 'mysql fulltext min length' para instruções simples.

Dito isto, o texto completo do MySQL tem limitações: por um lado, fica lento para atualizar quando você atinge um milhão de registros, aproximadamente ...

BJ.
fonte
2

Eu adicionaria mnoGoSearch à lista. Solução extremamente eficiente e flexível, que funciona como o Google: o indexador busca dados de vários sites, você pode usar critérios básicos ou inventar seus próprios ganchos para obter a máxima qualidade de pesquisa. Também poderia buscar os dados diretamente do banco de dados.

A solução não é tão conhecida hoje, mas atende às necessidades máximas. Você pode compilá-lo e instalá-lo ou em um servidor autônomo ou mesmo no servidor principal. Ele não precisa de tantos recursos quanto o Solr, como está escrito em C e funciona perfeitamente mesmo em pequenos servidores.

No começo, você precisa compilar você mesmo, portanto, requer algum conhecimento. Eu fiz um pequeno script para o Debian, o que poderia ajudar. Quaisquer ajustes são bem-vindos.

Como você está usando a estrutura do Django, você pode usar um cliente PHP no meio ou encontrar uma solução em Python, eu vi alguns artigos .

E, é claro, o mnoGoSearch é de código aberto, GNU GPL.

Fedir RYKHTIK
fonte