我有一个搜索查询(在Postman / Chrome中),它返回公司列表,但我需要根据特定模式过滤掉它们。我使用什么过滤器以及如何操作? 我需要过滤company_id LIKE%50%
的查询结果她就是我的经历:
{
"fields": [
"company_id"
],
"query": {
"bool": {
"must": [
{"term": {"app.raw": "AAA"}},
{"wildcard": {"cat.raw": "RS"}}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 5,
"sort": [],
"facets": {}
}
我得到了类似的东西:
"hits": [
{
...
"fields": {
"company_id": [
"745"
]
}
},
{
...
"fields": {
"company_id": [
"5056"
]
}
},
{
...
"fields": {
"company_id": [
"7765"
]
}
},
{
...
"fields": {
"company_id": [
"5044"
]
}
},
{
...
"fields": {
"company_id": [
"501"
]
}
答案 0 :(得分:0)
首先,我不完全确定您面临的问题。您没有得到正确/预期的结果?您需要包含已使用的映射,因为查询将取决于它。
通配符搜索很重。如果您想进行部分匹配搜索(相当于%like%)您可以在分析器中使用ngram token filter并进行术语搜索。它将负责匹配部分字符串。
您可以定义像
这样的分析器{
"settings":{
"analysis":{
"analyzer":{
"Like":{
"type":"custom",
"tokenizer":"keyword",
"filter":[ "lowercase", "ngram" ]
}
},
"filter":{
"ngram":{
"type":"ngram",
"min_gram":2,
"max_gram":15
}
}
}
}
}
在cat.raw的映射中定义上面定义的分析器“Like”。
如果您在分析器中使用了ngram,那么您可以将查询部分更改为简单的术语查询,如
"query": {
"bool": {
"must": [
{"term": {"app.raw": "AAA"}},
{"term": {"cat.raw": "RS"}}
],
"must_not": [],
"should": []
}
}
编辑:根据评论更新答案
好了,现在很清楚你想做什么。
一种方法是在地图中定义company_id
字符串并使用prefix query
"query": {
"bool": {
"must": [
{"term": {"app.raw": "AAA"}},
{"term": {"cat.raw": "RS"}},
{"prefix":{"company_id": "50"}}
],
"must_not": [],
"should": []
}
}
另一种选择可能是在分析器中为company_id使用edgengram并使用术语过滤/查询。
注意:对于“cat.raw”中的搜索,最好使用带有ngram而不是通配符查询的分析器这一术语查询。