所以我有一个遵循特定模式的数字。
AR-{number} 搜索指定的数字时,例如AR-1033
我在全局定义了简单的分析器,因为有不同的字段需要简单。
我尝试将关键字和空白分析器应用于数字字段并增强该字段。但我得到的回复是空的。
如果设置为标准,它会匹配每个文档,因为所有文档都有 AR-{number} 字段。 同样的事情也适用于遵循不同模式的其他索引中的不同字段(ER{number}、C{number} 等)
(是的,我在查询中转义了“-”,因此它会像“AR-1033”一样发送到 Elasticsearch)
我将 Elasticseach 7.10 与 FOSElasticaBundle 一起使用,但是当我尝试在 Kibana 中搜索时,我得到的结果与通过 IndexManager 搜索时相同,所以这并不重要。
非常感谢任何帮助!
您可以引入多字段。多字段包含源文本、其字母和数字以供单独搜索。通过正则表达式提取字母和数字
映射
PUT /numbers_in_pattern
{
"settings": {
"analysis": {
"filter": {
"number_extracter_filter": {
"type": "pattern_capture",
"preserve_original": false,
"patterns": [
"""[A-Z]+-(\d+)"""
]
},
"letter_extracter_filter": {
"type": "pattern_capture",
"preserve_original": false,
"patterns": [
"""([A-Z])+-\d+"""
]
}
},
"analyzer": {
"number_extracter_analyzer": {
"tokenizer": "keyword",
"filter": [
"number_extracter_filter"
]
},
"letter_extracter_analyzer": {
"tokenizer": "keyword",
"filter": [
"letter_extracter_filter"
]
}
}
}
},
"mappings": {
"properties": {
"model": {
"type": "keyword",
"fields": {
"number": {
"type": "text",
"analyzer": "number_extracter_analyzer"
},
"letters": {
"type": "text",
"analyzer": "letter_extracter_analyzer"
}
}
}
}
}
}
样本文件
PUT /numbers_in_pattern/_bulk
{"create":{"_id":1}}
{"model":"AR-123"}
{"create":{"_id":2}}
{"model":"AR-1234"}
{"create":{"_id":3}}
{"model":"AR-12345"}
{"create":{"_id":4}}
{"model":"AR-123456"}
另一个带有字母和数字的搜索查询,搜索分析器
GET /numbers_in_pattern/_search?filter_path=hits.hits
{
"query": {
"match": {
"model.number": {
"query": "AR-1234",
"analyzer": "number_extracter_analyzer"
}
}
}
}
回应
{
"hits" : {
"hits" : [
{
"_index" : "numbers_in_pattern",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.513566,
"_source" : {
"model" : "AR-1234"
}
}
]
}
}
仅使用数字搜索查询
GET /numbers_in_pattern/_search?filter_path=hits.hits
{
"query": {
"match": {
"model.number": "1234"
}
}
}
反应是一样的