作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
诚然,我对 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 文档,但它们的示例并不是很好。
最佳答案
您可以更改您的分析,以使用丢弃数字和低于分数的模式分析器:
{
"analysis": {
"analyzer": {
"word_only": {
"type": "pattern",
"pattern": "([^\p{L}]+)"
}
}
}
}
使用分析 API:
curl -XGET 'localhost:9200/{yourIndex}/_analyze?analyzer=word_only&pretty=true' -d 'WIN_8_ENT_1'
返回:
"tokens" : [ {
"token" : "win",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 1
}, {
"token" : "ent",
"start_offset" : 6,
"end_offset" : 9,
"type" : "word",
"position" : 2
} ]
您的映射将变为:
{
"event": {
"properties": {
"ipaddress": {
"type": "string"
},
"hostname": {
"type": "string",
"analyzer": "word_only",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
您可以使用 multi_match 查询来获得您想要的结果:
{
"query": {
"multi_match": {
"fields": [
"hostname",
"hostname.raw"
],
"query": "WIN_1"
}
}
}
关于用于连字符、下划线和数字的 Elasticsearch 自定义分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244519/
我是一名优秀的程序员,十分优秀!