sorting - specify - ¿Cómo ordenar en campo analizado/tokenizado en Elasticsearch?
select elasticsearch (1)
Puede usar el concepto integrado de Tipo de campo múltiple en Elasticsearch.
El tipo multi_field permite mapear varios core_types del mismo valor. Esto puede ser muy útil, por ejemplo, cuando se quiere asignar un tipo de cadena, una vez cuando se analiza y una vez cuando no se analiza.
En la Referencia de Elasticsearch, consulte la guía Clasificar cadenas y Campos múltiples sobre cómo configurar lo que necesita.
Tenga en cuenta que la configuración de asignación de campos múltiples ha cambiado entre Elasticsearch 0.90.X y 1.X. Use la siguiente guía apropiada según su versión:
Estamos almacenando un campo de title
en nuestro índice y queremos usar el campo para dos propósitos:
- Estamos analizando con un filtro de ngram para que podamos proporcionar resultados automáticos e instantáneos
- Queremos ser capaces de enumerar los resultados utilizando una ordenación ASC en el campo de
title
lugar de la puntuación.
El índice / filtro / analizador se define así:
array(
''number_of_shards'' => $this->shards,
''number_of_replicas'' => $this->replicas,
''analysis'' => array(
''filter'' => array(
''nGram_filter'' => array(
''type'' => ''nGram'',
''min_gram'' => 2,
''max_gram'' => 20,
''token_chars'' => array(''letter'',''digit'',''punctuation'',''symbol'')
)
),
''analyzer'' => array(
''index_analyzer'' => array(
''type'' => ''custom'',
''tokenizer'' =>''whitespace'',
''char_filter'' => ''html_strip'',
''filter'' => array(''lowercase'',''asciifolding'',''nGram_filter'')
),
''search_analyzer'' => array(
''type'' => ''custom'',
''tokenizer'' =>''whitespace'',
''char_filter'' => ''html_strip'',
''filter'' => array(''lowercase'',''asciifolding'')
)
)
)
),
El problema que estamos experimentando es resultados impredecibles cuando ordenamos en el campo de title
. Después de hacer una pequeña búsqueda, encontramos esto al final de la página del manual de sort
en ElasticSearch ... ( http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html #_memory_considerations )
Para los tipos basados en cadenas, el campo ordenado no debe ser analizado / tokenizado.
¿Cómo podemos analizar el campo y clasificarlo más tarde? ¿Necesitamos almacenar el campo dos veces con uno usando not_analyzed
para ordenar? Dado que la _source
campo también está almacenando el valor del title
en su estado original, ¿no se puede usar para ordenar?