post_filter in elasticsearch

개발새발·2023년 2월 25일
0

elasticsearch

목록 보기
46/54

결과 내 재검색 이라는 기능을 새로 구현해야됐다. 처음에는 검색하지 않고, DB를 거치고 해야되나? 근데 그럼 aggregation,paging, sorting은 어떻게..? 이게 괜찮은건가..? 별의별 생각을 해봤는데 문득 이런 기능 가진 서비스가 많은데? 라는 생각에 그냥 “결과 내 재검색 elastic” 이라는 키워드로 검색했다. 그랬더니 바로 나옴..!!! 그게 바로 post_filter 였다.

Post Filter 란?

필터로 한번 검색된 결과 중에 post_filter 에 정의한 조건에 맞는 결과를 찾아주는 기능이다. 말그대로 결과 내 재검색이다.


post filter 사용시

(개인적으로 테스트 해본거라 틀릴수도 있습니다. 틀린게 있다면 댓글 달아주세요!!)

  1. elasticsearch 의 count API 에서 post_filter는 사용할 수 없다.
    이것저것 시도해보니 하나 아차 싶은 게 있었는데, 제목?처럼elasticsearch 의 count API 에서 post_filter는 사용할 수 없다. 그래서 post_filter를 사용할 때는 search API를 사용하여 total로 count를 내줄 수 있게 예외처리를 해줬다.
  2. 특수문자(띄어쓰기 포함)의 경우 앞에 \ 역슬래시를 앞에 붙여줘야한다.
  3. keyword 타입인 필드에서만 동작하는 것 같다. (이건 확신X. 테스트해봤을 때 text 필드는 잘 안되더라구요..?)

post filter를 사용한 like검색과 AND검색

  1. post_filter 를 사용해서 sql의 like 검색처럼 하고 싶었다.
    term쿼리는 형태소 분석을 해버려서 원하는대로 결과가 안나왔다. (예를 들어, jumping 이라는 단어가 저장되어있는데 검색은 jump로 해야됨..) 그래서 사용한 게 바로 query_string을 사용한 와일드카드. 성능이 안 좋다는 말을 많이 봤지만… 어쩔 수 없었음…ㅜㅜ
  2. 키워드의 다중검색도 되야했다.
    이건 query_string 쿼리만 알면 간단했는데, query_string의 AND 검색을 통해 가능했다.

이런저런 테스트 끝에, 아래와 같은 쿼리문을 도출해냈다.

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "조건1-1": "하이"
          }
        }
      ],
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "조건2": true
              }
            }
          ]
        }
      }
    }
  },
  "from": 0,
  "size": 10,
  "sort": {
    "조건3": "asc"
  },
  "post_filter": {
    "query_string": {
      "query": "(*원피스\\!*) AND (*레드*)",
      "fields": [
        "조건1-2.keyword"
      ]
    }
  }
}

cc. https://steady-snail.tistory.com/121 ,
https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#post-filter

profile
발새발개

0개의 댓글