当前位置: 首页 > 面试题库 >

Elasticsearch定制分析器,用于连字符,下划线和数字

锺博耘
2023-03-14
问题内容

诚然,我不太了解ES的分析部分。这是索引布局:

{
    "mappings": {
        "event": {
            "properties": {
                "ipaddress": {
                    "type": "string"
                },
                "hostname": {
                    "type": "string",
                    "analyzer": "my_analyzer",
                    "fields": {
                        "raw": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }
    },
    "settings": {
        "analysis": {
            "filter": {
                "my_filter": {
                    "type": "word_delimiter",
                    "preserve_original": true
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": ["lowercase", "my_filter"]
                }
            }
        }
    }
}

您可以看到我尝试对主机名字段使用自定义分析器。当我使用此查询查找名为“ WIN_1”的主机时,这种工作方式如下:

{
    "query": {
        "match": {
            "hostname": "WIN_1"
        }
    }
}

问题是它还会返回其中包含1的任何主机名。使用_analyze端点,我可以看到数字也被标记。

{
    "tokens": [
        {
            "token": "win_1",
            "start_offset": 0,
            "end_offset": 5,
            "type": "word",
            "position": 1
        },
        {
            "token": "win",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 1
        },
        {
            "token": "1",
            "start_offset": 4,
            "end_offset": 5,
            "type": "word",
            "position": 2
        }
    ]
}

我想做的就是搜索WIN,并找回名称中带有WIN的所有主机。但是我还需要能够搜索WIN_1并找回确切的主机或名称中带有WIN_1的任何主机。以下是一些测试数据。

{
    "ipaddress": "192.168.1.253",
    "hostname": "WIN_8_ENT_1"
}
{
    "ipaddress": "10.0.0.1",
    "hostname": "server1"
}
{
    "ipaddress": "172.20.10.36",
    "hostname": "ServA-1"
}

希望有人可以指出正确的方向。可能我的简单查询也不是正确的方法。我已经介绍了ES文档,但是这些示例的确不好用。


问题答案:

这是分析器和我最终遇到的查询:

{
    "mappings": {
        "event": {
            "properties": {
                "ipaddress": {
                    "type": "string"
                },
                "hostname": {
                    "type": "string",
                    "analyzer": "hostname_analyzer",
                    "fields": {
                        "raw": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }
    },
    "settings": {
        "analysis": {
            "filter": {
                "hostname_filter": {
                    "type": "pattern_capture",
                    "preserve_original": 0,
                    "patterns": [
                        "(\\p{Ll}{3,})"
                    ]
                }
            },
            "analyzer": {
                "hostname_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [  "lowercase", "hostname_filter" ]
                }
            }
        }
    }
}

查询:查找以以下内容开头的主机名:

{
    "query": {
        "prefix": {
            "hostname.raw": "WIN_8"
        }
    }
}

查找包含以下内容的主机名:

{
    "query": {
        "multi_match": {
            "fields": [
                "hostname",
                "hostname.raw"
            ],
            "query": "WIN"
       }
   }
}

感谢Dan帮助我朝正确的方向发展。



 类似资料:
  • 问题内容: 是否可以创建可按空间拆分索引然后创建两个令牌的自定义elasticsearch分析器?一是空间前的一切,二是空间。例如:我存储的记录字段包含以下文本:“ 35 G”。现在,我想通过仅在该字段中键入“ 35”或“ 35 G”查询来接收该记录。因此,Elastic应该创建两个令牌:[‘35’,‘35 G’],并且不再更多。 如果可能,如何实现? 问题答案: 可使用tokenizer实现。

  • 我希望有一个正则表达式来检查字符串是否包含大小写字母、数字、下划线以及字符限制。这些是字符串中唯一允许的类型。

  • 问题内容: 我有以下字符串(此字符串的格式是通用的) 我只想提取。我该怎么办? 这不是我要对其执行此操作的唯一字符串,因此特定于此字符串的任何内容(例如,检查“ prasad_hv”)都无济于事。 我试着用拆分与作为分隔符,但它分裂和分开。请帮忙! PS进行概括,字符串将遵循以下格式 问题答案: 即使您想要的字符串中有许多下划线字符,这也将起作用。

  • 问题内容: 我必须使用此查询查找PDF手册: 指定名称为时,为什么会看到带有短划线的那个? 问题答案: 因为下划线是百分号之类的通配符,只不过它只查找一个字符。 SQL模式匹配使您可以使用“ _”来匹配任何单个字符,并使用“%”来匹配任意数量的字符(包括零个字符)。 (来自MySQL文档中的3.3.4.7。模式匹配。) 如果要将下划线用作文字,则必须对其进行转义:

  • 我试图匹配包含字母数字、连字符、下划线和空格的字符串。 连字符、下划线、空格和数字是可选的,但第一个和最后一个字符必须是字母。 例如,这些都应该匹配: 我试过这个: 但它在开始/结束时与空格、下划线或连字符匹配,但它应该只允许在两者之间。

  • 我正在尝试用下划线替换逗号、句号、连字符和空格。我尝试了以下方法,但在字符类中错误