HTML 태그로 검색되지 않게 만드려면 역인덱스에 토큰을 저장할 때 HTML 태그는 제거하고 토큰을 저장해야 한다. 그러려면 character filter로 html_strip을 활용해야 한다.
기존 인덱스에 설정되어 있는 Analyzer의 구성 요소를 수정하려면 인덱스를 재생성해야 한다. 삭제하고 다시 만들자.
DELETE /products
PUT /products
{
"settings": {
"analysis": {
// 커스텀 애널라이저 정의
"analyzer": {
"products_description_analyzer": {
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "text" // 유연한 검색 필요
},
"description": {
"type": "text", // 유연한 검색 필요
"analyzer": "products_description_analyzer"
},
"price": {
"type": "integer" // 10억 이하의 정수
},
"rating": {
"type": "double" // 실수(소수점을 가진 숫자 포함)
},
"category": {
"type": "text" // 유연한 검색 필요
}
}
}
}
GET /products
description 필드에 데이터를 넣으면 정말 HTML 태그를 제거하고 토큰으로 저장하는 지 Analyze API를 활용해 체크해보자.
GET /products/_analyze
{
"field": "description",
"text": "<h1>상품 설명</h1>"
}
[응답값]
{
"tokens": [
{
"token": "상품",
"start_offset": 4,
"end_offset": 6,
"type": "<HANGUL>",
"position": 0
},
{
"token": "설명",
"start_offset": 7,
"end_offset": 9,
"type": "<HANGUL>",
"position": 1
}
]
}
응답값을 살펴보면 HTML 태그를 제거하고 토큰으로 잘 저장하고 있는 걸 확인할 수 있다.
시험 삼아 다른 필드에서도 테스트해보자.
GET /products/_analyze
{
"field": "name",
"text": "<h1>상품 설명</h1>"
}
[응답값]
{
"tokens": [
{
"token": "h1",
"start_offset": 1,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "상품",
"start_offset": 4,
"end_offset": 6,
"type": "<HANGUL>",
"position": 1
},
{
"token": "설명",
"start_offset": 7,
"end_offset": 9,
"type": "<HANGUL>",
"position": 2
},
{
"token": "h1",
"start_offset": 11,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 3
}
]
}
html_strip 필터가 적용되지 않아서 HTML 태그도 같이 토큰으로 저장됐다.