Я пробовал два разных подхода к созданию индекса, и оба возвращают что-нибудь, если я ищу часть слова. По сути, если я ищу первые буквы или буквы в середине слова, я хочу получить все документы.
ПЕРВАЯ ТЕНТАТИВА ПО СОЗДАНИЮ ИНДЕКСА ЭТИМ СПОСОБОМ ( другой вопрос о стеке устарел ) :
POST correntistas/correntista
{
"index": {
"index": "correntistas",
"type": "correntista",
"analysis": {
"index_analyzer": {
"my_index_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"mynGram"
]
}
},
"search_analyzer": {
"my_search_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"standard",
"lowercase",
"mynGram"
]
}
},
"filter": {
"mynGram": {
"type": "nGram",
"min_gram": 2,
"max_gram": 50
}
}
}
}
}
ВТОРАЯ ПРЕДВАРИТЕЛЬНАЯ ИНФОРМАЦИЯ ПО СОЗДАНИЮ ИНДЕКСА ЭТИМ СПОСОБОМ ( другой недавний вопрос о переполнении стека )
PUT /correntistas
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete_search": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"autocomplete_index": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"nome": {
"type": "text",
"analyzer": "autocomplete_index",
"search_analyzer": "autocomplete_search"
}
}
}
}
Вторая попытка не удалась с
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [nome : {search_analyzer=autocomplete_search, analyzer=autocomplete_index, type=text}]"
}
],
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [properties]: Root mapping definition has unsupported parameters: [nome : {search_analyzer=autocomplete_search, analyzer=autocomplete_index, type=text}]",
"caused_by": {
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [nome : {search_analyzer=autocomplete_search, analyzer=autocomplete_index, type=text}]"
}
},
"status": 400
}
Хотя при первом способе создания индекса индекс создавался без исключения, он не работает, когда я ввожу часть свойств «nome».
Я добавил один документ таким образом
POST /correntistas/correntista/1
{
"conta": "1234",
"sobrenome": "Carvalho1",
"nome": "Demetrio1"
}
Теперь я хочу получить вышеуказанный документ, набрав первые буквы (например, De) или набрав часть слова с середины (например, встретил). Но ни один из двух способов, приведенных ниже, которые я ищу, не позволяет получить документ
Простой способ запроса:
GET correntistas/correntista/_search
{
"query": {
"match": {
"nome": {
"query": "De" #### "met" should I also work from my perspective
}
}
}
}
Более сложный способ запроса также терпит неудачу
GET correntistas/correntista/_search
{
"query": {
"match": {
"nome": {
"query": "De", #### "met" should I also work from my perspective
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1
}
}
}
}
Я не думаю, что это актуально, но вот версии (я использую эту версию, потому что она предназначена для работы в производстве с весенними данными, и есть некоторая "задержка" при добавлении новых версий Elasticsearch в Spring-data)
elasticsearch and kibana 6.8.4
PS: пожалуйста, не предлагайте мне использовать ни регулярные выражения, ни wilcards (*).
*** Отредактировано
Все шаги ниже были выполнены в консоли - Kibana / Dev Tools
Шаг 1:
POST /correntistas/correntista
{
"settings": {
"index.max_ngram_diff" :10,
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "ngram",
"min_gram": 2,
"max_gram": 8
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
Результаты на правой панели :
#! Deprecation: the default number of shards will change from [5] to [1] in 7.0.0; if you wish to continue using the default of [5] shards, you must manage this on the create index request or with an index template
{
"_index" : "correntistas",
"_type" : "correntista",
"_id" : "alrO-3EBU5lMnLQrXlwB",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
Шаг 2:
POST /correntistas/correntista/1
{
"title" : "Demetrio1"
}
Результаты на правой панели:
{
"_index" : "correntistas",
"_type" : "correntista",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
Шаг 3:
GET correntistas/_search
{
"query" :{
"match" :{
"title" :"met"
}
}
}
Результаты на правая панель:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
Если актуально:
Добавлен тип документа при получении URL
GET correntistas/correntista/_search
{
"query" :{
"match" :{
"title" :"met"
}
}
}
Также ничего не приносит:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
Поиск по всему тексту заголовка
GET correntistas/_search
{
"query" :{
"match" :{
"title" :"Demetrio1"
}
}
}
Выводит документ:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "correntistas",
"_type" : "correntista",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"title" : "Demetrio1"
}
}
]
}
}
Глядя на индекс, он не видит анализатора:
GET /correntistas/_settings
Результат на правой панели
{
"correntistas" : {
"settings" : {
"index" : {
"creation_date" : "1589067537651",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "jm8Kof16TAW7843YkaqWYQ",
"version" : {
"created" : "6080499"
},
"provided_name" : "correntistas"
}
}
}
}
Как я запускаю Elasticsearch и Kibana
docker network create eknetwork
docker run -d --name elasticsearch --net eknetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.4
docker run -d --name kibana --net eknetwork -p 5601:5601 kibana:6.8.4