Elasticsearch:过滤文档字段值中的子字符串?

时间:2014-07-21 01:38:02

标签: elasticsearch

我是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
    }
  }
}

2 个答案:

答案 0 :(得分:2)

问题是该字段未被分析,因此如果您有2个IP地址,则该术语实际上是完整字段,例如“123.3.4.12 134.4.5.6”。

我建议采用不同的方法 - 如果你总是要用空格分隔的IP地址列表,可以考虑使用空格标记器来创建令牌作为空格 - 应该创建几个令牌,然后IP地址将匹配:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-whitespace-tokenizer.html

答案 1 :(得分:0)

另一种方法可能是将IP地址存储为数组。然后当前的映射将起作用。索引文档时,您只需要分隔IP地址。