首页 文章

弹性搜索分析器

提问于
浏览
1

我想在elasticsearch中指定每个字段分析器 . 对于某些字段,我需要关键字分析器,而对于一个我需要一个自定义数字分析器,它将删除所有非数字字符(请参阅下面代码中的 number_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"
}

我注意到field1中的字符没有被删除(我的目标是仅保留 464533 ),而且我能够获得查询 field4:DEED_TYPE 的结果,尽管我不应该't (I think that the standard analyzer will remove the special character and perform lowercase, so I'期望 field4:DEED_TYPE 仅适用于关键字分析器) .

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

1 回答

  • 0

    通常,在查询时应用相同的分析规则,如在索引时应用的那样 . 所以当你搜索:

    field4:"DEED_TYPE"
    

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

    field4:"deed type"
    

    同样,分析不会影响字段的存储版本,我相信这是你在field1中引用的 . 存储的字段版本,即从索引中检索的版本作为搜索结果 . 因此,即使在分析中删除了字母,也只会反映在您搜索数据的方式上 . 如果要更改存储的字段表示,则应在进行lucene分析之前将其作为预处理 . 分析仪通常不是用于此的工具 .

    你的number_filter是错误的,你有倒退 . 应该:

    "number_filter" : {
        "type": "pattern_replace",
        "pattern": "[^\\d]+",
        "replacement": ""
    }
    

    [\\d]+ 匹配所有数字 . 根据您的描述,您想删除除数字之外的所有内容,因此 [^\\d]+

相关问题