Combinando sua estratégia de ingestão com seus padrões de consulta OpenSearch


Escolhendo a estratégia de indexação certa para o seu Serviço Amazon OpenSearch clusters ajudam a fornecer resultados precisos e de baixa latência, mantendo a eficiência. Se os seus padrões de acesso exigirem consultas complexas, é melhor reavaliar a sua estratégia de indexação.

Nesta postagem, demonstramos como você pode criar um analisador de índice personalizado no OpenSearch para implementar a funcionalidade de preenchimento automático de forma eficiente usando o Tokenizador Edge n-gram para corresponder a consultas de prefixo sem usar curingas.

O que é um analisador de índice?

Analisadores de índice são usados ​​para analisar campos de texto durante a ingestão de um documento. O analisador gera os termos que você pode usar para corresponder às consultas

Por padrão, o OpenSearch indexa seus dados usando o analisador de índice padrão. O analisador de índice padrão divide os tokens em espaços, converte os tokens em letras minúsculas e take away a maior parte da pontuação. Para alguns casos de uso (como análise de log), o analisador de índice padrão pode ser tudo de que você precisa.

Analisador de índice padrão

Vejamos o que o analisador de índice padrão faz. Usaremos o _analisar API para testar como o analisador de índice padrão tokeniza a frase “Analisador de índice padrão”.

Observação: Você pode executar todos os comandos desta postagem usando OpenSearch Ferramentas de desenvolvimento no OpenSearch Painel.

GET /_analyze
{
  "analyzer": "customary",
  "textual content": "Normal Index Analyzer."
}
#========
#Outcomes
#========
{
  "tokens": (
    {
      "token": "customary",
      "start_offset": 0,
      "end_offset": 8,
      "kind": "",
      "place": 0
    },
    {
      "token": "index",
      "start_offset": 9,
      "end_offset": 14,
      "kind": "",
      "place": 1
    },
    {
      "token": "analyzer",
      "start_offset": 15,
      "end_offset": 23,
      "kind": "",
      "place": 2
    }
  )
}

Observe como cada palavra foi minúscula e o ponto ultimate (pontuação) foi removido.

Criando seu próprio analisador de índice

OpenSearch oferece um grande número de analisadores integrados que você pode usar para diferentes padrões de acesso. Também permite criar seu próprio analisador personalizado, configurado para suas necessidades específicas de pesquisa. No exemplo a seguir, configuraremos um analisador personalizado que retorna correspondências parciais de palavras para uma lista de endereços. O analisador foi projetado especificamente para preenchimento automático funcionalidade, permitindo que os usuários finais encontrem endereços rapidamente sem precisar digitar (ou lembrar) um endereço inteiro. O preenchimento automático permite que o OpenSearch full efetivamente o termo de pesquisa com base nos prefixos correspondentes.

Primeiro, crie um índice chamado standard_index_test:

PUT standard_index_test
{
  "mappings": {
    "properties": {
      "text_entry": {
        "kind": "textual content",
        "analyzer": "customary"
      }
    }
  }
}

Não é necessário especificar o analisador como padrão porque o analisador padrão é o analisador padrão.

Para testar, adicione alguns dados em massa ao nosso standard_index_test que criamos.

POST _bulk
{"index":{"_index":"standard_index_test"}} 
{"text_entry": "123 Amazon Road Seattle, Wa 12345 "} 
{"index":{"_index":"standard_index_test"}}
{"text_entry": "456 OpenSearch Drive Anytown, Ny 78910"}
{"index":{"_index":"standard_index_test"}}
{"text_entry": "789 Palm approach Ocean Ave, Ca 33345"}
{"index":{"_index":"standard_index_test"}}
{"text_entry": "987 Openworld Road, Tx 48981"}

Consulte esses dados usando o texto “ope”.

GET standard_index_test/_search
{
  "question": {
    "match": {
      "text_entry": {
        "question": "ope"
      }
    }
  }
}
#========
#Outcomes
#========
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "whole": 5,
    "profitable": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "whole": {
      "worth": 0,
      "relation": "eq"
    },
    "max_score": n`ull,
    "hits": () # No matches 
  }
}

Ao pesquisar o termo “ope”, não encontramos nenhuma correspondência. Para entender o porquê, podemos nos aprofundar um pouco mais no analisador de índice padrão e ver como nosso texto está sendo tokenizado. Teste o analisador de índice padrão com o endereço “456 OpenSearch Drive Anytown, Ny 78910”.

POST standard_index_test/_analyze
{
  "analyzer": "customary",
  "textual content": "456 OpenSearch Drive Anytown, Ny 78910"
}
#========
#Outcomes
#========
  "tokens":
      "456" 
      "opensearch" 
      "drive" 
      "anytown"
      "ny" 
      "78910"

O analisador de índice padrão tokenizou o endereço em termos individuais: 456, opensearch, drive e assim por diante. Isso significa que, a menos que você procure um token particular person (como 456 ou opensearch) o, op, ope e até mesmo open não produzirá nenhum resultado. Uma opção é usar curingas enquanto ainda usa o analisador de índice padrão para indexação:

GET standard_index_test/_search
{
  "question": {
    "wildcard": {
      "text_entry": "ope*"
    }
  }
}

A consulta curinga corresponderia a “456 OpenSearch Drive Anytown, Ny 78910”, mas as consultas curinga podem consumir muitos recursos e ser lentas. Consultando por ope* no OpenSearch resulta na iteração de cada termo no índice, ignorando otimizações de índice invertido pesquisas. Isso resulta em maior uso de memória e desempenho mais lento. Para melhorar o desempenho de nossa execução de consultas e experiência de pesquisa, podemos usar um analisador de índice que melhor se adapte aos nossos padrões de acesso.

Borda n-grama

O Tokenizador Edge n-gram ajuda a encontrar correspondências parciais e evita o uso de curingas ao tokenizar prefixos de uma única palavra. Por exemplo, a palavra de entrada espresso é expandido em todos os seus prefixos, c, co , cofe assim por diante. Pode limitar os prefixos àqueles entre um mínimo (min_gram) e máximo (max_gram) comprimento. Então com min_gram=3 e max_gram=5expandirá “café” para cof, coffe coffe.

Crie um novo índice chamado custom_index com nosso próprio analisador de índice personalizado que usa Edge n-gramas. Defina o comprimento mínimo do token (min_gram) até 3 caracteres e o comprimento máximo do token (max_gram) até 20 caracteres. O min_gram e max_gram outline o comprimento mínimo e máximo do token retornado, respectivamente. Você deve selecionar o min_gram e max_gram com base em seus padrões de acesso. Neste exemplo, estamos pesquisando o termo “ope”, portanto não precisamos definir o comprimento mínimo para menos de 3, pois não estamos pesquisando termos como o ou op. Configurando o min_gram muito baixo pode levar a alta latência. Da mesma forma, não precisamos definir o comprimento máximo para algo maior que 20, pois nenhum token particular person excederá o comprimento de 20. Definir o comprimento máximo para 20 nos dá espaço de sobra caso eventualmente ingerimos um endereço com um comprimento de token maior. Observe que o índice que estamos criando aqui é especificamente para funcionalidade de preenchimento automático e provavelmente é desnecessário para um índice de pesquisa geral.

PUT custom_index
{
  "mappings": {
    "properties": {
      "text_entry": {
        "kind": "textual content",
        "analyzer": "autocomplete",         
        "search_analyzer": "customary"       
      }
    }
  },
  "settings": {
    "evaluation": {
      "filter": {
        "edge_ngram_filter": {
          "kind": "edge_ngram",
          "min_gram": 3,
          "max_gram": 20
        }
      },
      "analyzer": {
        "autocomplete": {
          "kind": "customized",
          "tokenizer": "customary",
          "filter": (
            "lowercase",
            "edge_ngram_filter"
          )
        }
      }
    }
  }
}

No código acima, criamos um índice chamado custom_index com um analisador personalizado chamado autocomplete. O analisador executa o seguinte:

  • Ele usa o tokenizer padrão para dividir o texto em tokens
  • Um filtro de letras minúsculas é aplicado para colocar todos os tokens em letras minúsculas
  • Os tokens são então divididos em pedaços menores com base nos valores mínimo e máximo de edge_ngram

O analisador de procura está configurado para usar o analisador padrão para reduzir o processamento de consulta necessário no momento da procura. Já aplicamos nosso analisador personalizado para dividir o texto após a ingestão e não precisamos repetir esse processo durante a pesquisa. Teste como o analisador personalizado analisa o texto Lexington Avenue:

GET custom_index/_analyze
{
  "analyzer": "autocomplete",
  "textual content": "Lexington Avenue"
}
#========
#Outcomes
#========
# Minimal token size is 3 so we cannot see l, or le
    "tokens": 
        "lex"  
        "lexi"  
        "lexin"  
        "lexing" 
        "lexingt" 
        "lexingto"    
        "lexington" 
        "ave"        
        "aven" 
        "avenu" 
        "avenue"

Observe como os tokens estão em letras minúsculas e agora suportam correspondências parciais. Agora que vimos como nosso analisador tokeniza nosso texto, adicione alguns dados em massa:

POST _bulk
{"index":{"_index":"custom_index"}} 
{"text_entry": "123 Amazon Road Seattle, Wa 12345 "} 
{"index":{"_index":"custom_index"}}
{"text_entry": "456 OpenSearch Drive Anytown, Ny 78910"}
{"index":{"_index":"custom_index"}}
{"text_entry": "789 Palm approach Ocean Ave, Ca 33345"}
{"index":{"_index":"custom_index"}}
{"text_entry": "987 Openworld Road, Tx 48981"}

E teste!

GET custom_index/_search
{
  "question": {
    "match": {
      "text_entry": {
        "question": "ope" 
      }
    }
  }
}
#========
#Outcomes
#========
 "hits": (
      {
        "_index": "custom_index",
        "_id": "aYCEIJgB4vgFQw3LmByc",
        "_score": 0.9733556,
        "_source": {
          "text_entry": "456 OpenSearch Drive Anytown, Ny 78910"
        }
      },
      {
        "_index": "custom_index",
        "_id": "a4CEIJgB4vgFQw3LmByc",
        "_score": 0.4095239,
        "_source": {
          "text_entry": "987 Openworld Road, Tx 48981"
        }
      }
    )

Você configurou um analisador de n-gramas personalizado para encontrar correspondências parciais de palavras em nossa lista de endereços.

Observe que há uma compensação entre o uso de analisadores de índice não padrão e a gravação de consultas com uso intensivo de computação. Os analisadores podem afetar o rendimento da indexação e aumentar o tamanho geral do índice, especialmente se usados ​​de forma ineficiente. Por exemplo, ao criar o custom_indexo analisador de pesquisa foi configurado para usar o analisador padrão. Usar n_grams para análise na ingestão e pesquisa teria impactado desnecessariamente o desempenho do cluster. Além disso, definimos o min_gram e max_gram para valores que correspondam aos nossos padrões de acesso, garantindo que não criamos mais n_grams do que o necessário para nosso caso de uso de pesquisa. Isso nos permitiu obter os benefícios da otimização da pesquisa sem afetar nosso rendimento de ingestão.

Conclusão

Nesta postagem, mudamos a forma como o OpenSearch indexava nossos dados para simplificar e acelerar as consultas de preenchimento automático. Em nosso caso, o uso de n-gramas Edge permitiu que o OpenSearch combinasse partes de um endereço e produzisse resultados precisos sem comprometer o desempenho do cluster com uma consulta curinga.

É sempre importante testar o cluster antes de implantar em um ambiente de produção. Compreender seus padrões de acesso é essencial para otimizar seu cluster tanto do ponto de vista de indexação quanto de pesquisa. Use as diretrizes desta postagem como ponto de partida. Confirme seus padrões de acesso antes de criar um índice e, em seguida, comece a experimentar diferentes analisadores de índice em um ambiente de teste para ver como eles podem simplificar suas consultas e melhorar o desempenho geral do cluster. Para obter mais informações sobre técnicas gerais de otimização de cluster OpenSearch, consulte o Comece a usar o Amazon OpenSearch Service: dimensione seu domínio para uma camiseta publicar.


Sobre os autores

Combinando sua estratégia de ingestão com seus padrões de consulta OpenSearch

Rakan Kandah

Rakan é arquiteto de soluções na AWS. Em seu tempo livre, Rakan gosta de tocar violão e ler.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *