如何在 Elasticsearch 中编写复杂的 DSL 查询?
How to write complex DSL query in Elasticsearch?
这是我在多字段映射中创建索引时使用的
curl -X PUT http://localhost:9200/mapping_log
{ "mappings":{ "properties":{"data1:{"type": "text","fields":{"keyword":{"type":"keyword"}}}, {"data2":{"type": "text","fields":{"keyword":{"type":"keyword"}}}, {"data3":{"type": "text","fields":{"keyword":{"type":"keyword"}}}, } } }
这是我在弹性搜索中的数据,我想进行搜索,例如,当我搜索支持时,我应该获取值数据和服务器,当我搜索开发人员时,我应该获取地理和图形,我想要data3 的建议者,比如假设如果我输入 g 那么我应该得到图形和地理的选项,有人可以帮我解决这个问题 ..
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "mapping_log",
"_type": "properties",
"_id": "1",
"_score": 1,
"_source": {
"data1": "support",
"data2": "data",
"data3": "datapos"
}
},
{
"_index": "mapping_log",
"_type": "properties",
"_id": "2",
"_score": 1,
"_source": {
"data1": "support",
"data2": "server",
"data3": "serverpos"
}
},
{
"_index": "mapping_log",
"_type": "properties",
"_id": "3",
"_score": 1,
"_source": {
"data1": "developer",
"data2": "graph",
"data3": "graphpos"
}
},
{
"_index": "mapping_log",
"_type": "properties",
"_id": "4",
"_score": 1,
"_source": {
"data1": "developer",
"data2": "geo",
"data3": "geopos"
}
}
]
}
}
您需要使用edge_ngram tokenizer along with the source filtering
添加一个工作示例,其中包含索引数据(与问题相同)、索引映射、搜索查询和搜索结果
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"data1": {
"type": "text"
},
"data2": {
"type": "text"
},
"data3": {
"type": "text",
"analyzer":"my_analyzer"
}
}
}
}
搜索查询:
when I search for support I should get values data and server
{
"_source": [
"data2"
],
"query": {
"multi_match": {
"query": "support",
"fields": [
"data1",
"data2"
]
}
}
}
搜索结果:
"hits": [
{
"_index": "67260491",
"_type": "_doc",
"_id": "1",
"_score": 1.4094054,
"_source": {
"data2": "server"
}
},
{
"_index": "67260491",
"_type": "_doc",
"_id": "4",
"_score": 0.44183272,
"_source": {
"data2": "data"
}
}
]
搜索查询:
{
"_source": [
"data2"
],
"query": {
"multi_match": {
"query": "developer",
"fields": [
"data1",
"data2"
]
}
}
}
搜索结果:
"hits": [
{
"_index": "67260491",
"_type": "_doc",
"_id": "2",
"_score": 1.0296195,
"_source": {
"data2": "graph"
}
},
{
"_index": "67260491",
"_type": "_doc",
"_id": "3",
"_score": 1.0296195,
"_source": {
"data2": "geo"
}
}
]
搜索查询:
I want suggester for data3 like suppose if I enter g then I should get
option of graph and geo
{
"_source": [
"data3"
],
"query": {
"match": {
"data3": "g"
}
}
}
搜索结果:
"hits": [
{
"_index": "67260491",
"_type": "_doc",
"_id": "3",
"_score": 1.1123568,
"_source": {
"data3": "geopos"
}
},
{
"_index": "67260491",
"_type": "_doc",
"_id": "2",
"_score": 0.99270093,
"_source": {
"data3": "graphpos"
}
}
]
更新 1:
您可以将索引映射更新为
PUT /<index-name>/_mapping
{
"properties": {
"data2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
这是我在多字段映射中创建索引时使用的
curl -X PUT http://localhost:9200/mapping_log
{ "mappings":{ "properties":{"data1:{"type": "text","fields":{"keyword":{"type":"keyword"}}}, {"data2":{"type": "text","fields":{"keyword":{"type":"keyword"}}}, {"data3":{"type": "text","fields":{"keyword":{"type":"keyword"}}}, } } }
这是我在弹性搜索中的数据,我想进行搜索,例如,当我搜索支持时,我应该获取值数据和服务器,当我搜索开发人员时,我应该获取地理和图形,我想要data3 的建议者,比如假设如果我输入 g 那么我应该得到图形和地理的选项,有人可以帮我解决这个问题 ..
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "mapping_log",
"_type": "properties",
"_id": "1",
"_score": 1,
"_source": {
"data1": "support",
"data2": "data",
"data3": "datapos"
}
},
{
"_index": "mapping_log",
"_type": "properties",
"_id": "2",
"_score": 1,
"_source": {
"data1": "support",
"data2": "server",
"data3": "serverpos"
}
},
{
"_index": "mapping_log",
"_type": "properties",
"_id": "3",
"_score": 1,
"_source": {
"data1": "developer",
"data2": "graph",
"data3": "graphpos"
}
},
{
"_index": "mapping_log",
"_type": "properties",
"_id": "4",
"_score": 1,
"_source": {
"data1": "developer",
"data2": "geo",
"data3": "geopos"
}
}
]
}
}
您需要使用edge_ngram tokenizer along with the source filtering
添加一个工作示例,其中包含索引数据(与问题相同)、索引映射、搜索查询和搜索结果
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"data1": {
"type": "text"
},
"data2": {
"type": "text"
},
"data3": {
"type": "text",
"analyzer":"my_analyzer"
}
}
}
}
搜索查询:
when I search for support I should get values data and server
{
"_source": [
"data2"
],
"query": {
"multi_match": {
"query": "support",
"fields": [
"data1",
"data2"
]
}
}
}
搜索结果:
"hits": [
{
"_index": "67260491",
"_type": "_doc",
"_id": "1",
"_score": 1.4094054,
"_source": {
"data2": "server"
}
},
{
"_index": "67260491",
"_type": "_doc",
"_id": "4",
"_score": 0.44183272,
"_source": {
"data2": "data"
}
}
]
搜索查询:
{
"_source": [
"data2"
],
"query": {
"multi_match": {
"query": "developer",
"fields": [
"data1",
"data2"
]
}
}
}
搜索结果:
"hits": [
{
"_index": "67260491",
"_type": "_doc",
"_id": "2",
"_score": 1.0296195,
"_source": {
"data2": "graph"
}
},
{
"_index": "67260491",
"_type": "_doc",
"_id": "3",
"_score": 1.0296195,
"_source": {
"data2": "geo"
}
}
]
搜索查询:
I want suggester for data3 like suppose if I enter g then I should get option of graph and geo
{
"_source": [
"data3"
],
"query": {
"match": {
"data3": "g"
}
}
}
搜索结果:
"hits": [
{
"_index": "67260491",
"_type": "_doc",
"_id": "3",
"_score": 1.1123568,
"_source": {
"data3": "geopos"
}
},
{
"_index": "67260491",
"_type": "_doc",
"_id": "2",
"_score": 0.99270093,
"_source": {
"data3": "graphpos"
}
}
]
更新 1:
您可以将索引映射更新为
PUT /<index-name>/_mapping
{
"properties": {
"data2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}