我有关于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未被分析
答案 0 :(得分:2)
是的,你可以利用Elasticsearch的全文功能,在没有正则表达式的情况下做到这一点。
GET /test/_search
{
"query": {
"match_phrase": {
"people": "Ling"
}
}
}
注意:在这种情况下,这也可能是match
或match_phrase_prefix
。 match_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”开头的文件