诚然,我不太了解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。模式匹配。) 如果要将下划线用作文字,则必须对其进行转义:
我试图匹配包含字母数字、连字符、下划线和空格的字符串。 连字符、下划线、空格和数字是可选的,但第一个和最后一个字符必须是字母。 例如,这些都应该匹配: 我试过这个: 但它在开始/结束时与空格、下划线或连字符匹配,但它应该只允许在两者之间。
我正在尝试用下划线替换逗号、句号、连字符和空格。我尝试了以下方法,但在字符类中错误