Elasticsearch术语查询值数组

时间:2016-08-21 23:12:19

标签: elasticsearch

我有关于ElasticSearch索引的数据,看起来像这样

 {
     "title": "cubilia",
      "people": [
          "Ling Deponte",
          "Dana Madin",
          "Shameka Woodard",
          "Bennie Craddock",
           "Sandie Bakker"
      ]
  }

有没有办法让我搜索名字开头的所有人 "灵" (应该不区分大小写)并获得适当的明确条款" Ling Deponte"不是" ling deponte"? 我发现在索引上以任何方式改变映射。

编辑执行我想要的但查询非常糟糕:

{
  "size": 0,
  "aggs": {
    "person": {
      "filter": {
        "bool":{
          "should":[
              {"regexp":{
                  "people.raw":"(.* )?[lL][iI][nN][gG].*"
              }}
             ]}
      },
      "aggs": {
        "top-colors": {
          "terms": {
              "size":10,
            "field": "people.raw",
            "include":
            {
              "pattern": ["(.* )?[lL][iI][nN][gG].*"]
            }
          }
        }
      }
    }
  }
}

people.raw未被分析

2 个答案:

答案 0 :(得分:2)

是的,你可以利用Elasticsearch的全文功能,在没有正则表达式的情况下做到这一点。

GET /test/_search
{
  "query": {
    "match_phrase": {
      "people": "Ling"
    }
  }
}

注意:在这种情况下,这也可能是matchmatch_phrase_prefixmatch_phrase*查询意味着文本中的值的顺序。 match只是查找任何值。由于你只有一个值,所以几乎无关紧要。

问题是您无法将文档响应限制为该名称,因为搜索API会返回文档。话虽如此,您可以使用nested文档并通过inner_hits获得所需的行为。

你做希望尽可能做通配符前缀,因为它根本不能大规模地工作。用SQL术语表示,就像进行全表扫描一样;你实际上失去了倒排索引的好处,因为它必须完全走它以找到实际的开始。

结合这两者应该可以很好地工作。在这里,我使用查询将结果排除在您感兴趣的内容之后,然后我使用您的内部聚合仅根据值包含。

{
  "size": 0,
  "query": {
    "match_phrase": {
      "people": "Ling"
    }
  }
  "aggs": {
    "person": {
      "terms": {
        "size":10,
        "field": "people.raw",
        "include": {
          "pattern": ["(.* )?[lL][iI][nN][gG].*"]
        }
      }
    }
  }
}

答案 1 :(得分:0)

您好请查找可能有助于您的请求的查询

GET skills/skill/_search
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "wildcard": {
                "skillNames.raw": "jav*"
              }
            }
          ]
        }
      }
    }
  }
}

我的目的是找到以“jav”开头的文件