修复一个简单的 Elasticsearch 查询
Fixing a Simple Elasticsearch Query
我有以下数据:
{
"results":[
{
"ID":"1",
"products":[
{
"product":"car",
"number":"5"
},
{
"product":"computer",
"number":"212"
}
]
},
{
"ID":"2",
"products":[
{
"product":"car",
"number":"9"
},
{
"product":"computer",
"number":"463"
},
{
"product":"bicycle",
"number":"5"
}
]
}
]
}
我的查询如下:
{
"query":{
"bool":{
"must":[
{
"wildcard":{
"results.products.product":"*car*"
}
},
{
"wildcard":{
"results.products.number":"*5*"
}
}
]
}
}
}
我期望的是只得到ID1。因为只有它有一个产品有 { "product":"car", "number":"5" } 记录。但我得到的是 ID1 和 ID2,因为 ID2 的第一条记录有 "product":"car",第三条记录分别有 "number":"5" 条记录。
我该如何解决这个问题?
您需要在创建映射时将产品定义为 nested type。尝试使用以下映射示例:
PUT http://localhost:9200/indexname
{
"mappings": {
"typename": {
"properties": {
"products" : {
"type" : "nested"
}
}
}
}
}
然后您可以根据需要使用嵌套查询来匹配数组的整个元素。
{
"query": {
"nested": {
"path": "products",
"query": {
"bool": {
"must": [
{ "wildcard": { "products.product": "*car*" }},
{ "wildcard": { "products.number": "*5*" }}
]
}
}
}
}
}
我有以下数据:
{
"results":[
{
"ID":"1",
"products":[
{
"product":"car",
"number":"5"
},
{
"product":"computer",
"number":"212"
}
]
},
{
"ID":"2",
"products":[
{
"product":"car",
"number":"9"
},
{
"product":"computer",
"number":"463"
},
{
"product":"bicycle",
"number":"5"
}
]
}
]
}
我的查询如下:
{
"query":{
"bool":{
"must":[
{
"wildcard":{
"results.products.product":"*car*"
}
},
{
"wildcard":{
"results.products.number":"*5*"
}
}
]
}
}
}
我期望的是只得到ID1。因为只有它有一个产品有 { "product":"car", "number":"5" } 记录。但我得到的是 ID1 和 ID2,因为 ID2 的第一条记录有 "product":"car",第三条记录分别有 "number":"5" 条记录。
我该如何解决这个问题?
您需要在创建映射时将产品定义为 nested type。尝试使用以下映射示例:
PUT http://localhost:9200/indexname
{
"mappings": {
"typename": {
"properties": {
"products" : {
"type" : "nested"
}
}
}
}
}
然后您可以根据需要使用嵌套查询来匹配数组的整个元素。
{
"query": {
"nested": {
"path": "products",
"query": {
"bool": {
"must": [
{ "wildcard": { "products.product": "*car*" }},
{ "wildcard": { "products.number": "*5*" }}
]
}
}
}
}
}