Marlos
(Marlos)
September 24, 2021, 2:01pm
1
Olá tudo bem ?
Estou realizando uma pesquisa de notícias utilizando o JSON e no nome contém o sinal de +
ex:"a+ Medicina Diagnóstica"
fiz a pesquisando utilizando o query_string e colocar o "\" antes do termo, ficando assim:
{"query": {"bool": {"must": [{"query_string": {"query": "\"Laboratório a mais\" OR \"a mais saúde\" OR \"a\\+ Medicina Diagnóstica\"","analyze_wildcard":"true", "fields": ["content", "title", "subtitle"]}}, {"terms": {"lang": ["pt"]}}, {"range": {"crawled_date": {"gte": "01/06/2021 00:00:00"}}}]}}, "sort": [{"published_date": {"order": "desc"}}], "size": 10, "from": 0}
Mas mesmo assim ele não retorna somente o termo "a+ Medicina Diagnóstica" ele retorna também o "a Medicina Diagnóstica".
Obrigado pela ajuda.
thiago
(Thiago Souza)
September 30, 2021, 11:26pm
2
Olá Marlos, como vai?
Poderia postar aqui o mapeamento do índice desta busca?
Abs!
Marlos
(Marlos)
October 1, 2021, 12:20am
3
Opa! Obrigado pelo seu tempo.
{
"prodknewin_digital": {
"aliases": {},
"mappings": {
"properties": {
"author": {
"type": "text"
},
"category": {
"type": "text"
},
"content": {
"type": "text"
},
"content_length": {
"type": "integer"
},
"crawled_date": {
"type": "date",
"format": "dd/MM/yyyy HH:mm:ss"
},
"domain": {
"type": "text"
},
"hat": {
"type": "text"
},
"id": {
"type": "integer"
},
"image_hits": {
"properties": {
"caption": {
"type": "text"
},
"credit": {
"type": "text"
},
"url": {
"type": "text"
}
}
},
"lang": {
"type": "text"
},
"locality": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"page": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"published_date": {
"type": "date",
"format": "dd/MM/yyyy HH:mm:ss"
},
"source": {
"type": "text"
},
"source_id": {
"type": "integer"
},
"source_locality": {
"properties": {
"country": {
"type": "text"
},
"countryAcronym": {
"type": "text"
},
"state": {
"type": "text"
},
"stateAcronym": {
"type": "text"
}
}
},
"subtitle": {
"type": "text"
},
"title": {
"type": "text"
},
"url": {
"type": "text"
}
}
},
"settings": {
"index": {
"number_of_shards": "1",
"provided_name": "prodknewin_digital",
"max_result_window": "900000",
"creation_date": "1620851434999",
"number_of_replicas": "1",
"uuid": "UEgaK_2HSA6pj8dwAtuWEw",
"version": {
"created": "7080099"
}
}
}
}
}
thiago
(Thiago Souza)
October 1, 2021, 7:21am
4
Obrigado! E poderia também confirmar qual a versão do Elasticsearch está usando?
Marlos
(Marlos)
October 1, 2021, 12:45pm
5
Claro!
{
"name": "dpJncDr",
"cluster_name": "elasticsearch",
"cluster_uuid": "QmT-rRN8R0WmpbJTPYIHVw",
"version": {
"number": "5.1.1",
"build_hash": "5395e21",
"build_date": "2016-12-06T12:36:15.409Z",
"build_snapshot": false,
"lucene_version": "6.3.0"
},
"tagline": "You Know, for Search"
}
thiago
(Thiago Souza)
October 1, 2021, 1:41pm
6
A questão aqui é que seu mapeamento está utilizando o standard analyzer . Este analyzer remove símbolos como o sinal de +
e desta forma vai de fato retornar textos com a Medicina Diagnóstica
mesmo se buscar por a+ Medicina Diagnóstica
.
Existem algumas formas de você contornar isso. Uma forma simples é configurar outro analyzer, pode ser com base no standard analyzer mesmo, e usar o mapping character filter com uma configuração a+ => a_PLUS
(e também para todos os outros código tipo a+
que existir no seu contexto). Desta forma o standard tokenizer vai entender a_PLUS
como uma palavra e assim vai ser incluído na indexação.
Espero ter ajudado!
Marlos
(Marlos)
October 1, 2021, 2:44pm
7
Vou fazer a modificação e coloco aqui o resultado!
Vou precisar de tempo para refazer o indice
Obrigado!