ElasticSearch:在对象数组中搜索

时间:2015-06-25 23:06:12

标签: elasticsearch search-engine

我在查询数组中的对象时遇到问题。 让我们创建一个非常简单的索引,添加一个带有一个字段的类型,并添加一个带有对象数组的文档(我使用感应控制台):

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
                 }
              }
           }

但没有任何帮助。我错过了什么?

2 个答案:

答案 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)

使用EnvironBuilder object文档

,这是您可以采用的一种方法

我定义了一个这样的索引:

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"
               }
           }
        }
    }
}

这是我使用的代码:

nested