Elasticsearch анализатор, работающий при создании броска Springdata, но не работающий при создании прямо из Postman / curl - PullRequest
0 голосов
/ 11 апреля 2020

Цель: создать индекс Elasticsearch, предназначенный для загрузки 10 миллионов простых документов. Каждый документ - это, в основном, «Elastisearch id», «id какой-то компании» и «name». Предоставить функцию поиска типа suer.

Я мог бы успешно создать индекс и анализатор либо прямо из Postman (curl или любой другой инструмент, не зависящий от Spring Data), либо во время начальной загрузки Spring. Тем не менее, когда я пытаюсь использовать анализатор, кажется, что он игнорируется для созданного прямо из Почтальона.

Итак, мой главный вопрос: добавляет ли Springdata какой-то параметр, который мне не хватает, когда я пытаюсь прямо опубликовать сообщение json? Вторичный вопрос: есть ли способ, позволяющий Springdata печатать автоматически сгенерированные и выполняемые команды (подобный подход с Hibernate, который c позволяет видеть напечатанные команды)? Если это так, я могу визуально отладить и проверить, что отличается.

Это способ создания Index и Analyzer из Springboot / Spring-Data.

основной метод для загрузки

@EnableElasticsearchRepositories
@SpringBootApplication
public class SearchApplication {

    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class, args);
    }

}

моя модель

@Document(indexName = "correntistas")
@Setting(settingPath = "data/es-config/elastic-setting.json")
@Getter
@Setter
public class Correntista {
    @Id
    private String id;
    private String conta;
    private String sobrenome;

    @Field(type = FieldType.Text, analyzer = "autocomplete_index", searchAnalyzer = "autocomplete_search")
    private String nome;
}

src / main / resources / data / es-config / elasti c -setting. json *** ЗАМЕТЬТЕ, ЧТО ЭТО ТО ТО ЖЕ НАСТРОЙКА, ИЗ КОТОРОГО Я ПОСТАВЛЯЮТСЯ POSTMAN

{
  "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"
        ]
      }
    }
  }
}

Проверяя, был ли он успешно создан, я вижу:

get http://localhost:9200/correntistas/_settings

{
    "correntistas": {
        "settings": {
            "index": {
                "number_of_shards": "5",
                "provided_name": "correntistas",
                "creation_date": "1586615323459",
                "analysis": {
                    "filter": {
                        "autocomplete_filter": {
                            "type": "edge_ngram",
                            "min_gram": "1",
                            "max_gram": "20"
                        }
                    },
                    "analyzer": {
                        "autocomplete_index": {
                            "filter": [
                                "lowercase",
                                "autocomplete_filter"
                            ],
                            "type": "custom",
                            "tokenizer": "standard"
                        },
                        "autocomplete_search": {
                            "filter": [
                                "lowercase"
                            ],
                            "type": "custom",
                            "tokenizer": "standard"
                        }
                    }
                },
                "number_of_replicas": "1",
                "uuid": "xtN-NOX3RQWJjeRdyC8CVA",
                "version": {
                    "created": "6080499"
                }
            }
        }
    }
}

Пока все хорошо.

Теперь я удаляю индекс с помощью curl -XDELETE localhost: 9200 / correntistas и я сделаем ту же идею, но сразу создадим индекс и анализатор из Почтальона:

put http://localhost: 9200 / correntistas с точно таким же анализатором, опубликованным выше:

creting index and analyiser at once

Затем, если я проверяю настройки, я вижу точно такой же результат, как он был создан выше из Spring-Data.

Я упустили какой-то дополнительный шаг, который Spring-Data дает бесплатно и скрывая от глаз?

Подводя итог, я вижу, что при создании из Spring-данных поиск выполняется с использованием нескольких букв, но при создании из почтальона он просто извлекает данные при поиске по целому слову.

*** Благодаря такая дружелюбная и умная помощь от Npsja Elasticsearch от Opster, я могу добавить здесь дополнительный трюк, который я узнал при публикации в Postman (какой-то заголовок, включенный в моем Postman, зависал с "... Root определение отображения имеет неподдерживаемые параметры ... mapper_parsing_exception ... ", пытаясь найти решение, ответили ниже. Я думаю, это было бы полезно добавить сюда для будущих читателей.

postman headers messing up

1 Ответ

1 голос
/ 11 апреля 2020

Поскольку вы не предоставили свой поисковый запрос, который вы используете в почтальоне, а также отображение, которое помогло бы нам отладить, если вы не используете правильный анализатор в полях, который вы используете в своем поисковом запросе. Помогает также добавление образцов документов и ваших фактических и ожидаемых результатов поиска.

Nvm, я добавил ваше отображение и ниже, как при использовании почтальона, вы получите правильные результаты.

Индекс определения точно такой же, как ваш

{
    "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": {
            "name": {
                "type": "text",
                "analyzer": "autocomplete_index",
                "search_analyzer": "autocomplete_search"
            }
        }
    }
}

Индекс образцов документов

{
    "name" : "opster"
}

{
    "name" : "jim c"
}

{
    "name" : "jimc"
}

{
    "name" : "foo"
}

Поиск отдельные слова, такие как ji, приносят jim c и jimc документы

{
    "query": {
        "match": {
            "name": {
                "query": "ji"
            }
        }
    }
}

Результат

  "hits": [
            {
                "_index": "61158504",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.69263697,
                "_source": {
                    "name": "jimc"
                }
            },
            {
                "_index": "61158504",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.6133945,
                "_source": {
                    "name": "jim c"
                }
            }
        ]

Примечание: - Вы также можете проверьте это и это ссылки для получения дополнительной информации об автозаполнении.

...