2016-11-14 4 views
1

현재 Google 색인의 일부 필드에 대해 UI에서 검색 유형을 추가하고 있습니다.Elasticsearch에서 IP 데이터 유형에 대한 검색

문자열 필드의 경우 Elasticsearch의 기능은이를 수행하는 여러 가지 방법을 허용합니다. 분석 된 토큰이나 인덱싱 중 ngram을 통해 match_phrase_prefix 쿼리를 통해.

그러나 IPv4 주소가 내부적으로 stored as long 인 경우 와일드 카드 또는 접두사 검색은 내가보기에는 쉽지 않습니다.

IP 범위를 검색하는 데 범위 쿼리를 사용할 수 있지만 사용자가 "118"을 입력하고 "168.1.118.32"및 "118.43.119.4"및 "1.1 .1.118 ".

이러한 쿼리를 수행 할 수있는 방법이 있습니까? 또는 필드를 분석 된 문자열로 별도로 저장해야합니까?

+0

나는이 전에하지 않은이 유 ElasticSearch 정규식을 사용하여 고려가? https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-regexp-query.html – nafas

+0

@nafas : 감사합니다. 작동하는 것처럼 보이지만이 기능을 사용하기를 꺼립니다. 수백만 개의 문서를 보유하고 있으므로 정규 표현식에서 상당한 성능을 기대합니다. 문자열의 경우 값 비싼 와일드 카드 및 regexp 일치 유형을 피하기 위해 접두사 일치 또는 phrase-prefix-match를 사용합니다. – 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" 
     } 
    }