2016-11-14 48 views
1

我们正在为用户界面中的索引中的某些字段添加搜索即用类型。Elasticsearch中IP数据类型的搜索类型

对于字符串字段,Elasticsearch的功能允许有多种方法来执行此操作,例如,通过match_phrase_prefix查询分析的标记或在编制索引期间通过ngram。

但是,由于IPv4地址内部为stored as long,因此在我看来,对它们执行通配符或前缀搜索并不容易。

可以使用范围查询搜索IP范围,但我宁愿让用户输入“118”并显示“168.1.118.32”以及“118.43.119.4”和“1.1”的匹配项.1.118" 。

是否有内置的方式来执行此类查询?或者我们是否需要将字段分别存储为分析后的字符串?

+0

我没有这样做过,具有u考虑使用正则表达式ElasticSearch? https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-regexp-query.html – nafas

+0

@nafas:谢谢,这似乎工作,但我不愿意使用这个,因为我们拥有数百万的文档,所以我期望使用正则表达式可以获得相当高的性能。对于字符串,我们使用前缀匹配或短语前缀匹配来避免昂贵的通配符和正则表达式匹配类型。 – centic

+0

说实话,如果你有静态的前缀(开头没有任何通配符),你就不会有太大的表现。我没有在ElasticSearch中使用正则表达式,但在Solr中使用它,所以我期望类似的行为 – nafas

回答

0

经过一番调查,我们使用了一个multi field来存储IP地址两次,一次是正常的IP类型,第二次作为分析值,我们将IP分成4个八位字节,这样我们就可以单独搜索这些部分。

在我们使用以下方式来分割的值写入索引时的模板:

"analyzer": { 
     "ipv4analyzer": { 
     "tokenizer": "ipv4tokenizer" 
     } 
    }, 
    "tokenizer": { 
     "ipv4tokenizer": { 
     "pattern": "([0-9]{1,3})", 
     "type": "pattern", 
     "group": "1" 
     } 
    }