我是Elasticsearch的新手。我有一个字符串字段的以下映射:
"ipAddress": {
"type": "string",
"store": "no",
"index": "not_analyzed",
"omit_norms": "true",
"include_in_all": false
}
ipAddress字段中具有值的文档如下所示:
"ipAddress": "123.3.4.12 134.4.5.6"
请注意,上面有两个IP地址,用空格分隔。
现在我需要根据此字段过滤文档。这是一个示例过滤器值
123.3.4.12
过滤器值始终是单个IP地址,如上所示。
我看看
处的过滤器http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filters.html
我似乎无法为此找到合适的过滤器。我尝试过术语过滤器,
{
"query": {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter": {
"term" : { "ipAddress" : "123.3.4.12" }
}
}
}
}
但似乎只有当过滤器值100%与文档字段的值匹配时才会返回文档。
任何人都可以帮我解决这个问题吗?
更新:
基于John Petrone的建议,我通过定义基于空白标记器的分析器来实现它,如下所示:
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"blank_sep_analyzer": {
"tokenizer": "whitespace"
}
}
}
}
},
"mappings": {
"ipAddress": {
"type": "string",
"store": "no",
"index": "analyzed",
"analyzer": "blank_sep_analyzer",
"omit_norms": "true",
"include_in_all": false
}
}
}
答案 0 :(得分:2)
问题是该字段未被分析,因此如果您有2个IP地址,则该术语实际上是完整字段,例如“123.3.4.12 134.4.5.6”。
我建议采用不同的方法 - 如果你总是要用空格分隔的IP地址列表,可以考虑使用空格标记器来创建令牌作为空格 - 应该创建几个令牌,然后IP地址将匹配:
答案 1 :(得分:0)
另一种方法可能是将IP地址存储为数组。然后当前的映射将起作用。索引文档时,您只需要分隔IP地址。