Este documento descreve as práticas recomendadas para a API Search. Usamos aspas simples ("'") em todo o lado para delimitar as strings de consulta. Desta forma, uma consulta que contenha expressões com várias palavras entre aspas duplas pode ser delimitada sem confusão:
'field:"some text" some-value'
.
Use campos atom para dados booleanos
Armazenar dados booleanos em campos numéricos é muito ineficiente. Em alternativa, use campos atom e atribua as suas constantes favoritas (verdadeiro/falso, sim/não, 0/1).
Transforme o negativo em positivo
Suponhamos que tem um termo especial para identificar restaurantes cuja cozinha não está definida. Se quiser excluir esses restaurantes, pode usar 'NOT cuisine:undefined'
como consulta. No entanto, esta opção é mais cara de avaliar (em termos de operações faturáveis e tempo de computação) do que a opção oposta, que consiste em encontrar restaurantes cuja gastronomia é conhecida. Em vez de ter um campo, cuisine, pode usar dois, cuisine
e cuisine_known
, sendo o último um campo atom. Para restaurantes cuja cozinha está definida, define o primeiro campo para a cozinha real e o segundo campo para "yes"
. Para restaurantes cuja gastronomia desconhece, defina a gastronomia como ""
(uma string vazia) e cuisine_known
como "no"
. Agora, para encontrar restaurantes cuja gastronomia é conhecida, envia uma consulta 'cuisine_known:yes'
, que é muito mais rápida do que a negação.
Transforme disjunções em conjunções
A disjunção "OR" é uma operação dispendiosa em termos de operações faturáveis e tempo de computação. Suponhamos que quer pesquisar 'cuisine:Japanese OR cuisine:Korean'
. Em alternativa, pode indexar documentos com categorias de cozinha mais gerais. Neste caso, a consulta pode ser simplificada para 'cuisine:Asian'
.
Elimine tautologias das suas consultas
Suponha que quer encontrar todos os restaurantes em Toronto. Partindo do princípio de que os seus documentos têm apenas um campo denominado "city", se usar a consulta 'city:toronto AND NOT city:montreal'
, obtém os mesmos resultados que 'city:toronto'
, porque se a cidade estiver definida como "toronto"
, não pode ser definida como "montreal"
. A segunda consulta é executada muito mais rapidamente, uma vez que envolve apenas um termo. A primeira consulta executa três passos: primeiro, encontra uma lista de documentos em que a cidade está definida como "toronto", depois encontra uma lista de todas as cidades em que a cidade não está definida como "montreal" e, finalmente, calcula a interseção das duas listas.
Restrinja o intervalo antes de ordenar
Suponhamos que a sua aplicação armazena informações sobre restaurantes em todo o mundo e quer mostrar os restaurantes mais próximos do utilizador atual. Uma forma de o fazer é ordenar os documentos correspondentes pela distância da localização do utilizador. No entanto, se tiver 1 000 000 de restaurantes, a execução de uma consulta como 'cuisine:japanese'
com a expressão de ordenação distance(geopoint(x, y), restaurant_loc) vai demorar muito tempo. É uma boa ideia adicionar filtros a uma consulta para começar com um conjunto mais proeminente de documentos selecionados para ordenar. Uma solução é criar categorias geográficas, como país, distrito e cidade. Pode inferir a cidade e o distrito a partir da localização do utilizador. Em seguida, a sua consulta torna-se 'cuisine:japanese AND city:<user-city>'
. É muito provável que já não precise de ordenar 1 000 000 de documentos.
Use categorias restritas para evitar ou minimizar a ordenação
Se usar a classificação para ordenar restaurantes por preço, pode criar um campo price_range
que contenha categorias de preços: price_0_10
, price_11_20
, price_21_30
, price_31_40
e price_41_lots
. Em seguida, pode encontrar todos os restaurantes com um custo entre 21 e 40 € sem qualquer ordenação através da consulta 'price_range:price_21_30 OR price_range:price_31_40'
. Em muitos casos, as categorias adequadas não são tão claras, mas com esta técnica pode rejeitar um grande número de documentos antes de reduzir a pesquisa com consultas dispendiosas, como '... AND price>25 AND price<35'
.
Não atribua pontuações às partidas, a menos que seja necessário
A pontuação é usada para indicar o nível de correspondência de um determinado documento com uma consulta. No entanto, a menos que pretenda ordenar por pontuação, não peça a classificação. Só vai tornar a sua pesquisa mais lenta.