elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene 弹性搜索分析器

Lucene 弹性搜索分析器,lucene,elasticsearch,Lucene,elasticsearch,我想在elasticsearch中指定每个字段的分析器。对于某些字段,我需要关键字分析器,而对于其中一个字段,我需要一个自定义数字分析器,它将删除所有非数字字符(请参阅下面代码中的number\u analyzer) 创建索引的请求是 { "settings": { "analysis" : { "analyzer" : { "number_analyzer" : { "type":

我想在elasticsearch中指定每个字段的分析器。对于某些字段,我需要关键字分析器,而对于其中一个字段,我需要一个自定义数字分析器,它将删除所有非数字字符(请参阅下面代码中的
number\u analyzer

创建索引的请求是

{
  "settings": {
        "analysis" : {
            "analyzer" : {
                "number_analyzer" : {
                   "type": "custom",
                   "tokenizer": "keyword",
                   "filter": ["lowercase"],
                   "char_filter": ["number_filter"]
                }
            },
            "char_filter" : {
                 "number_filter" : {
                     "type": "pattern_replace",
                     "pattern": "[\\d]+",
                     "replacement": ""
                 }
            }
        }
    }
}
字段的映射是

{
        "properties": {
            "field1": {
                "type": "string",
                "store": "yes",
                "index": "analyzed",
                "analyzer": "number_analyzer"
            },
            "field2": {
                "type": "string",
                "store": "yes",
                "index": "not_analyzed",
                "analyzer": "keyword"
            },
            "field3": {
                "type": "string",
                "store": "true",
                "index": "not_analyzed"
            },
            "field4": {
                "type": "string",
                "store": "yes",
                "index": "analyzed"
            },
            "field5": {
                "type": "string",
                "store": "yes",
                "index": "analyzed",
                "analyzer": "number_analyzer"
            }
        }
}
当我在索引中插入以下文档时

{
    "field1" : "464533AB",
    "field2" : "Euro",
    "field3" : "THIS IS A TITLE",
    "field4": "DEED_TYPE",
    "field5":"TEST3"
}
我注意到字段1中的字符没有被删除(我的目标是只保留
464533
),而且我能够得到查询
field4:dead_TYPE
的结果,尽管我不应该这样做(我认为标准分析器将删除特殊字符并执行小写,因此我希望
field4:dedit_TYPE
仅与关键字分析器一起工作)


上述代码中指定分析器的方式是否有任何错误?

通常,查询时将应用与索引时相同的分析规则。因此,在搜索时:

field4:"DEED_TYPE"
该查询将被分析,并成为:

field4:"deed type"
类似地,分析不会影响字段的存储版本,我相信这就是您在字段1中所指的。字段的存储版本,即从索引中检索到的作为搜索结果的版本。因此,即使在分析中删除了字母,这也只会反映在您搜索数据的方式上。如果在点击lucene分析之前,您需要更改字段的存储表示形式,这应该作为预处理来完成。分析器通常不是用于此的工具

但是,您的数字过滤器错误,您的数字过滤器是反向的。应该是:

"number_filter" : {
    "type": "pattern_replace",
    "pattern": "[^\\d]+",
    "replacement": ""
}
[\\d]+
匹配所有数字。根据您的描述,您希望删除除数字以外的所有内容,因此
[^\\d]+