[英]Elasticsearch match vs. term in filter
我在过滤器中看不到 term 和 match 之间的任何区别:
POST /admin/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"partnumber": "j1knd"
}
}
]
}
}
}
结果也包含不完全匹配的部件号,例如:“52527.J1KND-H”
为什么?
术语查询不会被分析,意味着您发送的任何内容都将用于匹配倒排索引中的标记,而匹配查询会被分析并应用于字段的相同分析器,该分析器在索引时使用并相应地匹配文档.
返回与提供的文本、数字、日期或布尔值匹配的文档。 在匹配之前分析提供的文本。
您还可以使用分析 API查看为特定字段生成的令牌。
standard analyzer
在52527.J1KND-H
文本上生成的标记。POST /_analyze
{
"text": "52527.J1KND-H",
"analyzer" : "standard"
}
{
"tokens": [
{
"token": "52527",
"start_offset": 0,
"end_offset": 5,
"type": "<NUM>",
"position": 0
},
{
"token": "j1knd",
"start_offset": 6,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "h",
"start_offset": 12,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 2
}
]
}
上面向您解释为什么您也得到不完全匹配的partnumbers
,例如:“52527.J1KND-H”,我会以您的示例以及如何使其工作。
{
"mappings": {
"properties": {
"partnumber": {
"type": "text",
"fields": {
"raw": {
"type": "keyword" --> note this
}
}
}
}
}
}
{
"partnumber" : "j1knd"
}
{
"partnumber" : "52527.J1KND-H"
}
{
"query": {
"bool": {
"filter": [
{
"term": {
"partnumber.raw": "j1knd" --> note `.raw` in field
}
}
]
}
}
"hits": [
{
"_index": "so_match_term",
"_type": "_doc",
"_id": "2",
"_score": 0.0,
"_source": {
"partnumber": "j1knd"
}
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.