我在查询数组中的对象时遇到问题。 让我们创建一个非常简单的索引,添加一个带有一个字段的类型,并添加一个带有对象数组的文档(我使用感应控制台):
PUT /test/
PUT /test/test/_mapping
{
"test": {
"properties": {
"parent": {"type": "object"}
}
}
}
Post /test/test
{
"parent": [
{
"name": "turkey",
"label": "Turkey"
},
{
"name": "turkey,mugla-province",
"label": "Mugla (province)"
}
]
}
现在我想要同时使用"turkey"
和"turkey,mugla-province"
这两个名称进行搜索。第一个查询工作正常:
GET /test/test/_search {"query":{ "term": {"parent.name": "turkey"}}}
但第二个没有回报:
GET /test/test/_search {"query":{ "term": {"parent.name": "turkey,mugla-province"}}}
我尝试了很多东西,包括:
"parent": {
"type": "nested",
"include_in_parent": true,
"properties": {
"label": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"store": true
}
}
}
但没有任何帮助。我错过了什么?
答案 0 :(得分:6)
对于搜索多个术语,请使用术语查询而不是术语查询。
std::string s = /*...*/;
for(auto c : s) {
if(std::islower(c)) ++NumberOfLowerCase;
else if(std::isupper(c)) ++NumberOfUpperCase;
else if(c == ' ') ++NumberOfSpaces;
else if(c == '\t') ++NumberOfTabs;
else if(c == '.') ++NumberOfPeriods;
else if(c == ',') ++NumberOfCommas;
else ++NumberOfOtherChars;
}
有多种方法可以构建此查询,但这是当前版本的ElasticSearch(1.6)中最简单和最优雅的
答案 1 :(得分:6)
我定义了一个这样的索引:
PUT /test_index
{
"mappings": {
"doc": {
"properties": {
"parent": {
"type": "nested",
"properties": {
"label": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
}
}
}
}
为您的文档编制索引:
PUT /test_index/doc/1
{
"parent": [
{
"name": "turkey",
"label": "Turkey"
},
{
"name": "turkey,mugla-province",
"label": "Mugla (province)"
}
]
}
然后这些查询中的任何一个都会返回它:
POST /test_index/_search
{
"query": {
"nested": {
"path": "parent",
"query": {
"match": {
"parent.name": "turkey"
}
}
}
}
}
POST /test_index/_search
{
"query": {
"nested": {
"path": "parent",
"query": {
"match": {
"parent.name": "turkey,mugla-province"
}
}
}
}
}
这是我使用的代码: