我尝试了两种不同的方法来创建索引,如果我搜索单词的一部分,它们都会返回任何内容。基本上,如果我在单词中间搜索第一个字母或字母,我想获得所有文档。
通过这样创建索引的第一个尝试(其他stackoverflow问题有点老):
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
}
}
}
}
}
通过以这种方式创建索引的第二个尝试(其他最近的 stackoverflow 问题)
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)或从中间输入部分单词(例如met)来检索上述文档。但是我正在搜索的以下两种方法都不是检索文档
简单的查询方法:
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
}
}
}
}
我认为不相关,但这里是版本(我正在使用这个版本,因为它旨在使用 spring-data 在生产中工作,并且在 Spring-data 中添加 Elasticsearch 较新版本存在一些“延迟”)
elasticsearch and kibana 6.8.4
PS.:请不要建议我使用正则表达式,也不要使用通配符(*)。
*** 已编辑
以下所有步骤均在控制台中完成 - 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