Como classificar usando em um determinado campo

Oct 07 2020

Eu tenho um documento

Como fazer a classificação usando um campo específico na pesquisa elástica

Minha consulta está abaixo

{
   "sort":{
      "name":"desc"
   },
   "from":10,
   "size":149,
   "query":{
      "match_all":{
         
      }
   }
}

Eu tenho erro

Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.')\"}" }

Meu nome de índice é data_new

Abaixo está o código para inserir no índice

test = [   {'id':1,'name': 'Cost Accounting 400', 'professor': ['Bill Cage', 'accounting']},
    { 'id':2,  'name': 'Computer Internals 250', 'professor': ['Gregg Payne', 'engineering']},
    {'id':3,   'name': 'Accounting Info Systems 350',   'professor': ['Bill Cage', 'accounting']},
    {'id':4,'name': 'Tax Accounting 200', 'professor': ['Thomas Baszo', 'finance']},
    {'id':5,'name': 'Capital Markets 350', 'professor': ['Thomas Baszo', 'finance']},
    {'id':6,'name': 'Theatre 410', 'professor': ['Sebastian Hern', 'art']},
    {'id':7,'name': 'Accounting 101', 'professor': ['Thomas Baszo', 'finance']},
    {'id':8,'name': 'Marketing 101', 'professor': ['William Smith', 'finance']},
    {'id':8,'name': 'Anthropology 230', 'professor': ['Devin Cranford', 'history']},
    {'id':10,   'name': 'Computer Science 101',
        'professor': ['Gregg Payne', 'engineering']}]
from elasticsearch import Elasticsearch
import json
es = Elasticsearch()
es.indices.create(index='data_new', ignore=400)
for e in test:
        es.index(index="data_new", body=e, id=e['id'])
search = es.search(index="data_new", body={"from" : 0, "size" : 2,"query": {"match_all": {}}})
search['hits']['hits']

Esperado para fora

  • Minha primeira saída esperada> Preciso classificar a saída em relação nameapenas a

  • Segundo resultado esperado> classificar em relação a nameentãoid

Como fazer a modificação em search = es.search(index="data_new", body={"from" : 0, "size" : 2,"query": {"match_all": {}}})

Passei pelo url https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.htmlque não está ajudando

Respostas

1 AlwaysSunny Oct 07 2020 at 17:10

Antes de habilitar fielddata, considere por que você está usando um campo de texto para agregações, classificação ou em um script. Geralmente não faz sentido fazer isso.

Um campo de texto é analisado antes da indexação para que um valor como New Yorkpossa ser encontrado pesquisando por newou por york. Uma agregação de termos neste campo retornará um newbalde e um yorkbalde, quando você provavelmente deseja um único balde chamadoNew York

Em vez disso, você deve ter um campo de texto para pesquisas de texto completo e um campo de palavra-chave não analisado com doc_valueshabilitado para agregações, como segue:

PUT data_new
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}

Eu acho que você já pode tratar nome como palavra-chave usando name.keywordcomo abaixo,

GET /data_new/_search
{
  "sort" : [
     { "name.keyword" : {"order" : "asc"}}
  ],
 "from":10,
 "size":149,
 "query":{
   "match_all":{
     
     }
   }
}

Veja :

https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html

1 Yash Oct 07 2020 at 12:44

você pode fazer uma solicitação PUT no índice para definir fielddata como verdadeiro:

curl --location --request PUT 'http://localhost:9200/index_name/info/_mapping' \
--header 'Content-Type: application/json' \
--data-raw '{
  "properties": {
     "desc": { 
       "type":     "text",
       "fielddata": true
     }
  }
}'

onde descestá o nome da coluna