Elasticsearch 分析器在创建时工作抛出 Spring Data 但在直接从 Postman/curl 创建时失败
Elasticsearch analizer working when created throw Springdata but failing when creating straight from Postman/curl
目标:创建旨在加载 1000 万个简单文档的 Elasticsearch 索引。每个文档基本上都是 "Elastisearch id"、"some company id" 和 "name"。提供 search-as-suer-type 功能。
我可以直接从 Postman(curl 或任何其他不依赖 Spring 数据的工具)或在 Spring 启动初始化期间成功创建索引和分析器。然而,当我尝试使用分析器时,它似乎被直接从 Postman 创建的分析器忽略了。
所以我的主要问题是:Springdata 是否添加了一些我在尝试直接发布 json stting 时遗漏的设置?第二个问题是:是否有某种方式可以启用 Springdata 来打印命令 auto-generated 并执行(与 Hibernate 类似的方法 whihc 允许您查看打印的命令)?如果是这样,我可以直观地调试并检查有什么不同。
这是从 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/elastic-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 删除索引,我会做同样的事情,但是从 Postman 立即创建索引和分析器:
将 http://localhost:9200/correntistas 与上面发布的完全相同的分析器放在一起:
然后,如果我检查设置,我会看到与上面从 Spring-Data 创建的结果完全相同的结果。
我是否错过了 Spring-Data 提供的一些额外的步骤,这些步骤是免费提供的,并且可以躲避眼睛?
总而言之,当我从 Spring-data 创建时,我看到使用几个字母进行搜索时有效,但是当我从邮递员创建时,它只是在我搜索整个单词时检索数据。
*** 感谢 Opster Elasticsearch Ninja 如此友好和聪明的帮助,我可以在这里添加一个我在从 Postman 发帖时学到的额外技巧(不知何故,在我的 Postman 中启用的一些 header 因“. .. 根映射定义有不受支持的参数... mapper_parsing_exception...”在尝试下面回答的解决方案时。我想在此处添加对未来的读者可能很有用。
由于您没有提供您在邮递员中使用的搜索查询,也没有提供映射,这将帮助我们进行调试,如果您没有在字段上使用正确的分析器,您将在搜索查询中使用.此外,添加示例文档以及您实际和预期的搜索结果总是有帮助的。
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"
}
}
]
目标:创建旨在加载 1000 万个简单文档的 Elasticsearch 索引。每个文档基本上都是 "Elastisearch id"、"some company id" 和 "name"。提供 search-as-suer-type 功能。
我可以直接从 Postman(curl 或任何其他不依赖 Spring 数据的工具)或在 Spring 启动初始化期间成功创建索引和分析器。然而,当我尝试使用分析器时,它似乎被直接从 Postman 创建的分析器忽略了。
所以我的主要问题是:Springdata 是否添加了一些我在尝试直接发布 json stting 时遗漏的设置?第二个问题是:是否有某种方式可以启用 Springdata 来打印命令 auto-generated 并执行(与 Hibernate 类似的方法 whihc 允许您查看打印的命令)?如果是这样,我可以直观地调试并检查有什么不同。
这是从 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/elastic-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 删除索引,我会做同样的事情,但是从 Postman 立即创建索引和分析器:
将 http://localhost:9200/correntistas 与上面发布的完全相同的分析器放在一起:
然后,如果我检查设置,我会看到与上面从 Spring-Data 创建的结果完全相同的结果。
我是否错过了 Spring-Data 提供的一些额外的步骤,这些步骤是免费提供的,并且可以躲避眼睛?
总而言之,当我从 Spring-data 创建时,我看到使用几个字母进行搜索时有效,但是当我从邮递员创建时,它只是在我搜索整个单词时检索数据。
*** 感谢 Opster Elasticsearch Ninja 如此友好和聪明的帮助,我可以在这里添加一个我在从 Postman 发帖时学到的额外技巧(不知何故,在我的 Postman 中启用的一些 header 因“. .. 根映射定义有不受支持的参数... mapper_parsing_exception...”在尝试下面回答的解决方案时。我想在此处添加对未来的读者可能很有用。
由于您没有提供您在邮递员中使用的搜索查询,也没有提供映射,这将帮助我们进行调试,如果您没有在字段上使用正确的分析器,您将在搜索查询中使用.此外,添加示例文档以及您实际和预期的搜索结果总是有帮助的。
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"
}
}
]