개발일지

[Elasticsearch] 검색 쿼리 단어 중 특정 단어에 가중치 - multi_match, match, should

송채채 2023. 5. 1. 12:47
반응형

1. 사람들이 검색을 할 때 "바나나와 사과의 차이점" 이라고 검색을 하면, 키워드 추출로 "바나나", "사과"를 탐색하도록 하는 코드가 이전에 적었던 키워드 추출 관련 게시물이다

2. 키워드를 가지고 검색을 할 때, elasticsearch를 사용하고 쿼리문을 아래와 같이 작성하였다.

3. 보통 가장 먼저 나오는 단어에 가까운 검색결과를 원한다고 생각하기 때문에 첫 단어에 가중치를 더 주고 싶었다. chatGPT와 elastic 공식 문서를 참고하여 작성하였다.

from elasticsearch_dsl import Search, Q, MultiMatch, Match
search_query = ["바나나 사과 딸기"]
s = Search(using=es, index="인덱스명") \
    .query(
        Q('bool',
          should=[
              MultiMatch(
                  query= search_query
                  fields=["title^2", "description"], # title에 가중치
                  type="cross_fields", # 여러 필드에서 검색
                  minimum_should_match="25%", # search_query의 25% 이상 매치된 것만 검색
                  operator="or"
              ),
              Match(
                  title={
                      "query": search_query.split(" ")[0], # 첫번째 바나나에 가중치 주기
                      "boost": 5
                  }
              )
          ]
        )
    )

response = s[0:100].execute()