指定 Elasticsearch 匹配

问题描述 投票:0回答:1

所以我有一个遵循特定模式的数字。

AR-{number} 搜索指定的数字时,例如AR-1033

我在全局定义了简单的分析器,因为有不同的字段需要简单。

我尝试将关键字和空白分析器应用于数字字段并增强该字段。但我得到的回复是空的。

如果设置为标准,它会匹配每个文档,因为所有文档都有 AR-{number} 字段。 同样的事情也适用于遵循不同模式的其他索引中的不同字段(ER{number}、C{number} 等)

(是的,我在查询中转义了“-”,因此它会像“AR-1033”一样发送到 Elasticsearch)

我将 Elasticseach 7.10 与 FOSElasticaBundle 一起使用,但是当我尝试在 Kibana 中搜索时,我得到的结果与通过 IndexManager 搜索时相同,所以这并不重要。

非常感谢任何帮助!

elasticsearch search elastica foselasticabundle
1个回答
0
投票

您可以引入多字段。多字段包含源文本、其字母和数字以供单独搜索。通过正则表达式提取字母和数字

映射

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"
        }
    }
}

反应是一样的

© www.soinside.com 2019 - 2024. All rights reserved.