Introdução
A indexação de pesquisa de texto completo (FTS) pode ser um desafio para quem não está familiarizado com a pesquisa em geral. Nesta postagem, abordaremos alguns casos de uso comuns de pesquisa e trabalharemos na criação de índices apropriados seguindo as práticas recomendadas para a indexação de FTS do Couchbase.
Casos de uso
Os seguintes casos de uso comuns de pesquisa serão explorados:
- Pesquisa simples
- Pesquisa independente de campo
- Como encontrar o vizinho mais próximo
- Pesquise documentos com um modelo que está mudando o tempo todo
Modelo de dados de amostra de viagem
Ao longo deste documento, faremos referência ao Conjunto de dados de amostra de viagens disponível para instalação em qualquer instância do Couchbase Server. O bucket de amostra de viagem tem vários tipos de documentos distintos: companhia aérea, rota, aeroporto, ponto de referência e hotel. O modelo de documento para cada tipo de documento contém:
- Uma chave que atua como uma chave primária
- Um campo de id que identifica o documento
- Um campo de tipo que identifica o tipo de documento
A figura a seguir ilustra a relação entre os diferentes tipos de documentos no bucket de amostra de viagem. Ela mostra os campos de chave primária, ID e tipo que cada documento tem, além de alguns campos representativos em cada tipo de documento. (Os documentos de referência não estão na foto).
Figura 0. Documentos no modelo de dados de amostra de viagem
Exemplos de casos de uso
Pesquisa simples
Resumo do caso de uso: um usuário encontrará hotéis pesquisando uma palavra-chave no campo de descrição do hotel e verá uma lista de hotéis correspondentes.
Etapas de criação do índice:
- Na interface de usuário da Pesquisa de texto completo, clique em "Adicionar índice".
- Especifique um nome de índice, por exemplo, "hotel_desc", e selecione o bucket de amostra de viagem.
- Como cada documento no bucket de amostra de viagem tem um campo "type" que indica o tipo de documento, deixe "JSON type field" definido como "type".
- Em mapeamentos de tipos:
- Clique em "+ Adicionar mapeamento de tipo" e especifique "hotel" como o nome do tipo, pois o requisito é pesquisar todos os documentos de hotéis.
- Uma lista de analisadores disponíveis pode ser acessada por meio do menu suspenso à direita do campo de nome do tipo. Para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão do índice.
- Como o requisito é pesquisar apenas o campo de descrição do hotel, marque "indexar apenas os campos especificados". Com essa opção marcada, somente os campos especificados pelo usuário do documento são incluídos no índice do mapeamento de tipo de hotel (o mapeamento não será dinâmico)o que significa que todos os campos são considerados disponíveis para indexação).
- Clique em OK.
- Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de descrição seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "description" (descrição).
- type (tipo): Deixe essa opção definida como texto para o campo de descrição.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Essa configuração inclui o conteúdo do campo nos valores retornados da pesquisa e permite destacar as expressões correspondentes nos resultados, mas também aumenta o tamanho do índice e o tempo de criação. Deixe essa opção desmarcada, pois não há necessidade de destacar os resultados para esse caso de uso.
- Caixa de seleção "incluir no campo _all": Desmarcar isso porque o caso de uso é pesquisar especificamente o campo de descrição.
- caixa de seleção "incluir vetores de termos": Certos tipos de funcionalidade (como realce e pesquisa de frases) exigem vetores de termos, mas isso aumenta o tamanho do índice e o tempo de criação. Desmarcar essa caixa, pois o caso de uso é uma pesquisa de palavras-chave sem destaque.
- Clique em OK.
- Finalmente, desmarcar a caixa de seleção ao lado do mapeamento de tipo "padrão". Se o mapeamento padrão for deixado ativado, todos os documentos no compartimento serão incluídos no índice, independentemente de o usuário especificar ativamente os mapeamentos de tipo. Apenas os documentos do hotel são necessários, e eles são incluídos pelo mapeamento do tipo de hotel adicionado anteriormente.
- Os valores padrão são suficientes para os painéis recolhidos restantes (Analyzers, Custom Filters, Date/Time Parsers e Advanced).
- As réplicas de índice podem ser definidas como 1, 2 ou 3, desde que o cluster esteja executando o serviço Search em n+1 nós. Com um cluster de desenvolvimento de nó único, mantenha o valor padrão de 0.
- Para Tipo de índice, o valor padrão de "Versão 6.0 (Scorch)" é apropriado para todos os índices recém-criados. O Scorch reduz o tamanho do índice no disco e oferece desempenho aprimorado para indexação e tratamento de mutações.
- Nesse ponto, a página de índice de criação deve se parecer com o último quadro capturado na Figura 1. Clique em "Criar índice" para concluir o processo.
Figura 1 - Criação do índice "hotel_desc"
Observação: consulte "Index: hotel_desc" no Apêndice A para ver a carga útil JSON usada para criar esse índice com a API REST.
Teste de consultas no índice:
- Na UI de pesquisa de texto completo, aguarde até que o progresso da indexação mostre 100% e, em seguida, clique no nome do índice "hotel_desc".
- Para pesquisar qualquer hotel com a palavra-chave "farm" (fazenda) na descrição, na caixa de texto "search this index..." (pesquisar neste índice), digite "description:farm" (descrição: fazenda) e clique em Search (pesquisar). Esse escopo de campo da pesquisa é necessário porque o A caixa de seleção "incluir no campo _all" não foi marcada.
- Os resultados são mostrados (semelhante à Figura 2) com a chave de cada documento correspondente.
Figura 2 - Índice "hotel_desc" busca por "description:farm" (descrição: fazenda)
4. A mesma pesquisa pode ser executada por meio da API REST usando curl:
1 2 3 4 5 6 7 8 9 10 11 12 |
enrolar -u nome de usuário:senha -XPOST -H "Content-Type: application/json" \ http://localhost:8094/api/index/hotel_desc/query \ -d '{ "explain": verdadeiro, "fields": [ "*" ], "highlight": {}, "query": { "consulta": "description:farm" } }' |
Pesquisa independente de campo
Resumo do caso de uso: um usuário encontrará hotéis pesquisando nos campos de nome do hotel, alias, descrição, endereço e avaliações por uma palavra-chave e verá uma lista de hotéis correspondentes que inclui as correspondências destacadas.
Etapas de criação do índice:
- Na interface de usuário da Pesquisa de texto completo, clique em "Adicionar índice".
- Especifique um nome de índice, por exemplo, "hotel_mult_fields", e selecione o bucket de amostra de viagem.
- Como cada documento no bucket de amostra de viagem tem um campo "type" que indica o tipo de documento, deixe "JSON type field" definido como "type".
- Em mapeamentos de tipos:
- Clique em "+ Adicionar mapeamento de tipo" e especifique "hotel" como o nome do tipo, pois o requisito é pesquisar todos os documentos de hotéis.
- Uma lista de analisadores disponíveis pode ser acessada por meio do menu suspenso à direita do campo de nome do tipo. Para esse caso de uso, deixe a opção "inherit" selecionada para que o mapeamento de tipos herde o analisador padrão do índice.
- Como o requisito é pesquisar os campos de nome do hotel, alias, descrição, endereço e avaliações, marque "indexar apenas os campos especificados". Com essa opção marcada, somente os campos especificados pelo usuário do documento são incluídos no índice para o mapeamento do tipo de hotel (o mapeamento não será dinâmico, o que significa que todos os campos são considerados disponíveis para indexação).
- Clique em OK.
- Adicione cada um dos 5 campos ao mapeamento do tipo de hotel:
- Nome: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "name".
- type (tipo): Deixe essa opção definida como texto para o campo de nome.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa, o que permite destacar as expressões correspondentes nos resultados.
- Caixa de seleção "incluir no campo _all": Deixe-a marcada, pois o requisito do caso de uso é pesquisar vários campos.
- Caixa de seleção "incluir vetores de termos": Deixe-a marcada, pois o caso de uso exige o destaque dos resultados.
- Clique em OK.
- Alias: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "alias".
- type (tipo): Deixe essa opção definida como texto para o campo de nome.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa, o que permite destacar as expressões correspondentes nos resultados.
- Caixa de seleção "incluir no campo _all": Deixe-a marcada, pois o requisito do caso de uso é pesquisar vários campos.
- Caixa de seleção "incluir vetores de termos": Deixe-a marcada, pois o caso de uso exige o destaque dos resultados.
- Clique em OK.
- Descrição: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "description" (descrição).
- type (tipo): Deixe essa opção definida como texto para o campo de nome.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa, o que permite destacar as expressões correspondentes nos resultados.
- Caixa de seleção "incluir no campo _all": Deixe-a marcada, pois o requisito do caso de uso é pesquisar vários campos.
- Caixa de seleção "incluir vetores de termos": Deixe-a marcada, pois o caso de uso exige o destaque dos resultados.
- Clique em OK.
- Endereço: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "address" (endereço).
- type (tipo): Deixe essa opção definida como texto para o campo de nome.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa, o que permite destacar as expressões correspondentes nos resultados.
- Caixa de seleção "incluir no campo _all": Deixe-a marcada, pois o requisito do caso de uso é pesquisar vários campos.
- Caixa de seleção "incluir vetores de termos": Deixe-a marcada, pois o caso de uso exige o destaque dos resultados.
- Clique em OK.
- Comentários: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "reviews".
- type (tipo): Deixe essa opção definida como texto para o campo de nome.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa, o que permite destacar as expressões correspondentes nos resultados.
- Caixa de seleção "incluir no campo _all": Deixe-a marcada, pois o requisito do caso de uso é pesquisar vários campos.
- Caixa de seleção "incluir vetores de termos": Deixe-a marcada, pois o caso de uso exige o destaque dos resultados.
- Clique em OK.
- Nome: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- Finalmente, desmarcar a caixa de seleção ao lado do mapeamento de tipo "padrão". Se o mapeamento padrão for deixado ativado, todos os documentos no compartimento serão incluídos no índice, independentemente de o usuário especificar ativamente os mapeamentos de tipo. Apenas os documentos do hotel são necessários, e eles são incluídos pelo mapeamento do tipo de hotel adicionado anteriormente.
- Os valores padrão são suficientes para os painéis recolhidos restantes (Analyzers, Custom Filters, Date/Time Parsers e Advanced).
- As réplicas de índice podem ser definidas como 1, 2 ou 3, desde que o cluster esteja executando o serviço Search em n+1 nós. Com um cluster de desenvolvimento de nó único, mantenha o valor padrão de 0.
- Para Tipo de índice, o valor padrão de "Versão 6.0 (Scorch)" é apropriado para todos os índices recém-criados. O Scorch reduz o tamanho do índice no disco e oferece desempenho aprimorado para indexação e tratamento de mutação.
- Nesse ponto, a página de índice de criação deve se parecer com o último quadro capturado na Figura 3. Clique em "Criar índice" para concluir o processo.
Figura 3 - Criação do índice "hotel_mult_fields"
Observação: consulte "Index: hotel_mult_fields" no Apêndice A para ver a carga útil JSON usada para criar esse índice por meio da API REST.
Teste de consultas no índice:
- Na UI de pesquisa de texto completo, aguarde até que o progresso da indexação mostre 100% e, em seguida, clique no nome do índice "hotel_mult_fields".
- Para pesquisar hotéis com a palavra-chave "fazenda" nos campos de nome, alias, descrição, endereço ou avaliações, na caixa de texto "pesquisar este índice...", digite "fazenda" e clique em Pesquisar. O escopo de campo da pesquisa não é necessário porque o A caixa de seleção "include in _all field" foi marcada para cada campo indexado no mapeamento do tipo de hotel.
- Os resultados são mostrados (semelhante à Figura 4) com a chave de cada documento correspondente e as correspondências destacadas em cada documento correspondente.
Figura 4 - Resultados da pesquisa do índice "hotel_mult_fields" para "farm" (fazenda)
4. A mesma pesquisa pode ser executada por meio da API REST usando curl:
1 2 3 4 5 6 7 8 9 10 11 12 |
enrolar -u nome de usuário:senha -XPOST -H "Content-Type: application/json" \ http://localhost:8094/api/index/hotel_mult_fields/query \ -d '{ "explain": verdadeiro, "fields": [ "*" ], "highlight": {}, "query": { "query" (consulta): "farm" } }' |
Como encontrar o vizinho mais próximo
Resumo do caso de uso: um usuário encontrará hotéis a uma certa distância de um local especificado e verá uma lista de nomes de hotéis correspondentes ordenados por distância do local especificado.
Etapas de criação do índice:
- Na interface de usuário da Pesquisa de texto completo, clique em "Adicionar índice".
- Especifique um nome de índice, por exemplo, "hotel_geo", e selecione o bucket de amostra de viagem.
- Como cada documento no bucket de amostra de viagem tem um campo "type" que indica o tipo de documento, deixe "JSON type field" definido como "type".
- Em mapeamentos de tipos:
- Clique em "+ Adicionar mapeamento de tipo" e especifique "hotel" como o nome do tipo, pois o requisito é pesquisar todos os documentos de hotéis.
- Uma lista de analisadores disponíveis pode ser acessada por meio do menu suspenso à direita do campo de nome do tipo. Para esse caso de uso, deixe a opção "inherit" selecionada para que o mapeamento de tipos herde o analisador padrão do índice.
- Como o requisito é pesquisar apenas a localização do hotel, verifique "indexar apenas os campos especificados". Com essa opção marcada, somente os campos especificados pelo usuário do documento são incluídos no índice para o mapeamento do tipo de hotel (o mapeamento não será dinâmico, o que significa que todos os campos são considerados disponíveis para indexação).
- Clique em OK.
- Adicione os campos geo e name ao mapeamento do tipo de hotel:
- Geo: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo geográfico do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "geo".
- type (tipo): Defina isso como ponto geográfico.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa.
- Caixa de seleção "incluir no campo _all": Deixe-a marcada, pois o requisito do caso de uso é pesquisar o campo geográfico.
- Clique em OK.
- Nome: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo de nome do hotel seja incluído individualmente no índice. Especifique o seguinte:
- campo: Digite o nome do campo a ser indexado, "name".
- type (tipo): Deixe essa opção definida como texto para o campo de nome.
- pesquisável como: Deixe-o igual ao nome do campo para o caso de uso atual. Pode ser usado para indicar um nome de campo alternativo.
- analisador: Como foi feito para o mapeamento de tipos, para esse caso de uso, deixe a opção "herdar" selecionada para que que o mapeamento de tipos herda o analisador padrão.
- caixa de seleção do índice: Deixe essa opção marcada para que o campo seja incluído no índice. Desmarcar a caixa removeria explicitamente o campo do índice.
- caixa de seleção da loja: Verificar essa configuração para incluir o conteúdo do campo nos resultados da pesquisa.
- Caixa de seleção "incluir no campo _all": Desmarcar este já que o requisito do caso de uso é pesquisar apenas por local, mas exibir o nome nos resultados da pesquisa.
- caixa de seleção "incluir vetores de termos": Certos tipos de funcionalidade (como realce e pesquisa de frases) exigem vetores de termos, mas isso aumenta o tamanho do índice e o tempo de criação. Desmarcar essa caixa, pois o caso de uso é pesquisar apenas por localização geográfica.
- Clique em OK.
- Geo: Passe o mouse sobre a linha com o mapeamento do tipo de hotel e clique no botão + e, em seguida, clique em "inserir campo filho". Isso permitirá que o campo geográfico do hotel seja incluído individualmente no índice. Especifique o seguinte:
- Finalmente, desmarcar a caixa de seleção ao lado do mapeamento de tipo "padrão". Se o mapeamento padrão for deixado ativado, todos os documentos no intervalo serão incluídos no índice, independentemente de o usuário especificar ativamente os mapeamentos de tipo. Somente os documentos do hotel são necessários, e eles são incluídos pelo mapeamento do tipo de hotel adicionado anteriormente.
- Os valores padrão são suficientes para os painéis recolhidos restantes (Analyzers, Custom Filters, Date/Time Parsers e Advanced).
- As réplicas de índice podem ser definidas como 1, 2 ou 3, desde que o cluster esteja executando o serviço Search em n+1 nós. Com um cluster de desenvolvimento de nó único, mantenha o valor padrão de 0.
- Para Tipo de índice, o valor padrão de "Versão 6.0 (Scorch)" é apropriado para todos os índices recém-criados. O Scorch reduz o tamanho do índice no disco e oferece desempenho aprimorado para indexação e tratamento de mutação.
- Nesse ponto, a página de criação de índice deve se parecer com a Figura 5. Clique em "Criar índice" para concluir o processo.
Figura 5 - Criação do índice "hotel_geo"
Observação: consulte "Index: hotel_geo" no Apêndice A para ver a carga útil JSON usada para criar esse índice por meio da API REST.
Teste de consultas no índice:
- Na UI Full Text Search, aguarde até que o progresso da indexação mostre 100%.
- Somente as consultas de "string de consulta" podem ser testadas por meio da UI de pesquisa no console da Web do Couchbase, portanto pesquisa geoespacial será testado por meio da API REST usando curl. Pesquise os 2 hotéis mais próximos a uma milha de um local em São Francisco, retornando o nome do hotel e as coordenadas ordenadas por distância usando o seguinte corpo de consulta JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
enrolar -u nome de usuário:senha -XPOST -H "Content-Type: application/json" \ http://localhost:8094/api/index/hotel_geo/query \ -d '{ "from": 0, "size": 2, "fields": [ "name", "geo" ], "query": { "location": { "lon": -122.4194, "lat": 37.7749 }, "distance" (distância): "1mi", "field" (campo): "geo" }, "sort": [ { "by": "geo_distance", "field" (campo): "geo", "unit": "mi", "location": { "lon": -122.4194, "lat": 37.7749 } } ] }' |
3. Resultado da consulta JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
{ "status": { "total": 6, "falhou": 0, "bem-sucedido": 6 }, "request" (solicitação): { "query" (consulta): { "localização": [ -122.4194, 37.7749 ], "distância": "1mi", "campo": "geo" }, "tamanho": 2, "de": 0, "destaque": nulo, "campos": [ "name" (nome), "geo" ], "facetas": nulo, "explicar": falso, "sort": [ { "por": "geo_distance" (distância geográfica), "campo": "geo", "localização": { "lat": 37.7749, "longo": -122.4194 }, "unidade": "mi" } ], "includeLocations": falso }, "hits": [ { "índice": "hotel_geo_72ca6700aea9283d_aa574717", "id": "hotel_25593", "pontuação": 0.09668939164302555, "sort": [ " \u0001?XA7]\u0003\u0010\u0002" ], "campos": { "geo": [ -122.42000007592608, 37.7739999880488 ], "name" (nome): "Hotel Civic Center" } }, { "índice": "hotel_geo_72ca6700aea9283d_aa574717", "id": "hotel_26263", "pontuação": 0.09668939164302555, "sort": [ " \u0001?h.>\u001dOJ\"7" ], "campos": { "geo": [ -122.42320003510062, 37.77719998913285 ], "name" (nome): "Pousada Hayes Valley" } } ], "total_hits": 37, "max_score": 0.1169539736791776, "pegou": 720591, "facetas": nulo } |
Pesquisa dinâmica
Resumo do caso de uso: um usuário encontrará hotéis pesquisando uma palavra-chave que aparece em qualquer atributo do documento do hotel e verá uma lista de hotéis correspondentes.
Nesse caso, queremos pesquisar dados que estão mudando o tempo todo: os campos serão adicionados ou removidos, ou os campos podem mudar de uma simples string para um objeto, e nossa pesquisa deve encontrar os pontos de referência correspondentes o tempo todo. Para atender a esse requisito, criaremos um índice dinâmico.
Etapas de criação do índice:
- Na interface de usuário da Pesquisa de texto completo, clique em "Adicionar índice".
- Especifique um nome de índice, por exemplo, "hotel_dynamic", e selecione o bucket de amostra de viagem.
- Como cada documento no bucket de amostra de viagem tem um campo "type" que indica o tipo de documento, deixe "JSON type field" definido como "type".
- Em mapeamentos de tipos:
- Clique em "+ Adicionar mapeamento de tipo" e especifique "hotel" como o nome do tipo, pois o requisito é pesquisar todos os documentos de hotéis.
- Uma lista de analisadores disponíveis pode ser acessada por meio do menu suspenso à direita do campo de nome do tipo. Para esse caso de uso, deixe a opção "inherit" selecionada para que o mapeamento de tipos herde o analisador padrão do índice.
- Como o requisito é pesquisar todos os campos do documento do hotel, deixe "indexar apenas os campos especificados" desmarcada. Com essa opção desmarcada, o mapeamento será dinâmico, o que significa que todos os campos serão considerados disponíveis para indexação.
- Clique em OK.
- Finalmente, desmarcar a caixa de seleção ao lado do mapeamento de tipo "padrão". Se o mapeamento padrão for deixado ativado, todos os documentos no intervalo serão incluídos no índice, independentemente de o usuário especificar ativamente os mapeamentos de tipo. Somente os documentos do hotel são necessários, e eles são incluídos pelo mapeamento do tipo de hotel adicionado anteriormente.
- Os valores padrão são suficientes para os painéis recolhidos restantes (Analyzers, Custom Filters, Date/Time Parsers e Advanced).
- As réplicas de índice podem ser definidas como 1, 2 ou 3, desde que o cluster esteja executando o serviço Search em n+1 nós. Com um cluster de desenvolvimento de nó único, mantenha o valor padrão de 0.
- Para Tipo de índice, o valor padrão de "Versão 6.0 (Scorch)" é apropriado para todos os índices recém-criados. O Scorch reduz o tamanho do índice no disco e oferece desempenho aprimorado para indexação e tratamento de mutação.
- Nesse ponto, a página de criação de índice deve se parecer com a Figura 5. Clique em "Criar índice" para concluir o processo.
Figura 6 - Criação do índice "hotel_dynamic"
Observação: consulte "Índice: hotel_dynamic" no Apêndice A para ver a carga útil JSON usada para criar esse índice por meio da API REST.
Teste de consultas no índice:
- Na UI de pesquisa de texto completo, aguarde até que o progresso da indexação mostre 100% e, em seguida, clique no nome do índice "hotel_dynamic".
- Para pesquisar hotéis com a palavra-chave "fazenda" em qualquer campo dos documentos do hotel, na caixa de texto "pesquisar este índice...", digite "fazenda" e clique em Pesquisar. O escopo de campo da pesquisa não é necessário porque todos os campos estão incluídos no índice dinâmico.
- Os resultados são mostrados (semelhante à Figura 7) com a chave de cada documento correspondente.
Figura 7 - Resultados da pesquisa do índice "hotel_dynamic" para "farm" (fazenda)
4. A mesma pesquisa pode ser executada por meio da API REST usando curl:
1 2 3 4 5 6 7 8 9 10 |
enrolar -u nome de usuário:senha -XPOST -H "Content-Type: application/json" \ http://localhost:8094/api/index/hotel_dynamic/query \ -d '{ "fields": [ "*" ], "query": { "query" (consulta): "farm" } }' |
Apêndice A - Definição de índice JSON
Índice: hotel_desc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
{ "tipo": "fulltext-index", "name" (nome): "hotel_desc", "uuid": "", "sourceType": "couchbase", "sourceName": "amostra de viagem", "sourceUUID": "", "planParams": { "maxPartitionsPerPIndex": 171 }, "params": { "doc_config": { "docid_prefix_delim": "", "docid_regexp": "", "mode" (modo): "type_field", "type_field": "tipo" }, "mapeamento": { "análise": {}, "default_analyzer": "padrão", "default_datetime_parser": "dateTimeOptional", "default_field": "_all", "default_mapping": { "dinâmico": verdadeiro, "habilitado": falso }, "default_type": "_default", "docvalues_dynamic": verdadeiro, "index_dynamic": verdadeiro, "store_dynamic": falso, "type_field": "_type", "tipos": { "hotel": { "dinâmico": falso, "habilitado": verdadeiro, "propriedades": { "description" (descrição): { "dinâmico": falso, "habilitado": verdadeiro, "campos": [ { "índice": verdadeiro, "name" (nome): "description" (descrição), "tipo": "texto" } ] } } } } }, "loja": { "indexType": "scorch" (queimar), "kvStoreName": "" } }, "sourceParams": {} } |
Índice: hotel_mult_fields
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
{ "tipo": "fulltext-index", "name" (nome): "hotel_mult_fields", "uuid": "", "sourceType": "couchbase", "sourceName": "amostra de viagem", "sourceUUID": "", "planParams": { "maxPartitionsPerPIndex": 171 }, "params": { "doc_config": { "docid_prefix_delim": "", "docid_regexp": "", "mode" (modo): "type_field", "type_field": "tipo" }, "mapeamento": { "análise": {}, "default_analyzer": "padrão", "default_datetime_parser": "dateTimeOptional", "default_field": "_all", "default_mapping": { "dinâmico": verdadeiro, "habilitado": falso }, "default_type": "_default", "docvalues_dynamic": verdadeiro, "index_dynamic": verdadeiro, "store_dynamic": falso, "type_field": "_type", "tipos": { "hotel": { "dinâmico": falso, "habilitado": verdadeiro, "propriedades": { "endereço": { "dinâmico": falso, "habilitado": verdadeiro, "campos": [ { "include_in_all": verdadeiro, "include_term_vectors": verdadeiro, "índice": verdadeiro, "name" (nome): "endereço", "loja": verdadeiro, "tipo": "texto" } ] }, "alias": { "dinâmico": falso, "habilitado": verdadeiro, "campos": [ { "include_in_all": verdadeiro, "include_term_vectors": verdadeiro, "índice": verdadeiro, "name" (nome): "alias", "loja": verdadeiro, "tipo": "texto" } ] }, "description" (descrição): { "dinâmico": falso, "habilitado": verdadeiro, "campos": [ { "include_in_all": verdadeiro, "include_term_vectors": verdadeiro, "índice": verdadeiro, "name" (nome): "description" (descrição), "loja": verdadeiro, "tipo": "texto" } ] }, "name" (nome): { "dinâmico": falso, "habilitado": verdadeiro, "campos": [ { "include_in_all": verdadeiro, "include_term_vectors": verdadeiro, "índice": verdadeiro, "name" (nome): "name" (nome), "loja": verdadeiro, "tipo": "texto" } ] }, "avaliações": { "dinâmico": falso, "habilitado": verdadeiro, "campos": [ { "include_in_all": verdadeiro, "include_term_vectors": verdadeiro, "índice": verdadeiro, "name" (nome): "avaliações", "loja": verdadeiro, "tipo": "texto" } ] } } } } }, "loja": { "indexType": "scorch" (queimar), "kvStoreName": "" } }, "sourceParams": {} } |
Índice: hotel_geo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
{ "name" (nome): "hotel_geo", "tipo": "fulltext-index", "params": { "mapeamento": { "tipos": { "hotel": { "habilitado": verdadeiro, "dinâmico": falso, "propriedades": { "name" (nome): { "habilitado": verdadeiro, "dinâmico": falso, "campos": [ { "name" (nome): "name" (nome), "tipo": "texto", "loja": verdadeiro, "índice": verdadeiro, "include_term_vectors": falso, "include_in_all": falso } ] }, "geo": { "habilitado": verdadeiro, "dinâmico": falso, "campos": [ { "name" (nome): "geo", "tipo": "geopoint" (ponto geográfico), "loja": verdadeiro, "índice": verdadeiro, "include_term_vectors": verdadeiro, "include_in_all": verdadeiro } ] } } } }, "default_mapping": { "habilitado": falso, "dinâmico": verdadeiro }, "default_type": "_default", "default_analyzer": "padrão", "default_datetime_parser": "dateTimeOptional", "default_field": "_all", "store_dynamic": falso, "index_dynamic": verdadeiro }, "loja": { "indexType": "scorch" (queimar), "kvStoreName": "" }, "doc_config": { "mode" (modo): "type_field", "type_field": "tipo", "docid_prefix_delim": "", "docid_regexp": "" } }, "sourceType": "couchbase", "sourceName": "amostra de viagem", "sourceUUID": "", "sourceParams": {}, "planParams": { "maxPartitionsPerPIndex": 171, "numReplicas": 0 }, "uuid": "" } |
Índice: hotel_dynamic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
{ "name" (nome): "hotel_dynamic", "tipo": "fulltext-index", "params": { "mapeamento": { "tipos": { "hotel": { "habilitado": verdadeiro, "dinâmico": verdadeiro } }, "default_mapping": { "habilitado": falso, "dinâmico": verdadeiro }, "default_type": "_default", "default_analyzer": "padrão", "default_datetime_parser": "dateTimeOptional", "default_field": "_all", "store_dynamic": falso, "index_dynamic": verdadeiro }, "loja": { "indexType": "scorch" (queimar), "kvStoreName": "" }, "doc_config": { "mode" (modo): "type_field", "type_field": "tipo", "docid_prefix_delim": "", "docid_regexp": "" } }, "sourceType": "couchbase", "sourceName": "amostra de viagem", "sourceUUID": "", "sourceParams": {}, "planParams": { "maxPartitionsPerPIndex": 171, "numReplicas": 0 }, "uuid": "" } |