弹性:在搜索期间将符号和 html 编码符号视为相同

Elastic: Treat symbol and html encoded symbol the same during search

我的目标是 return 通过符号或 html 编码版本搜索时得到相同的结果。

示例查询:

# searching with symbol
GET my-test-index/_search
{
  "query": {
    "bool": {
      "must": {
        "simple_query_string": {
          "query": "Hello®",
          "analyzer": "english_syn",
          "fields": [
            "AllContent"
          ]
        }
      }
    }
  }
}

# html symbol
GET my-test-index/_search
{
  "query": {
    "bool": {
      "must": {
        "simple_query_string": {
          "query": "Hello®",
          "analyzer": "english_syn",
          "fields": [
            "AllContent"
          ]
        }
      }
    }
  }
}

我尝试了几种不同的方法。

添加同义词但它们仍然产生不同的结果。

#######################################
# Synonyms
# Symbols
#######################################
™, ™
®, ®

创建了一个 char_filter 来替换特殊字符,这样他们至少会搜索“Hello”。但这会带来一系列问题,这些问题超出了我想要实现的范围。

char_filter": {
    "specialCharactersFilter": {
    "type": "pattern_replace",
    "pattern": "[^A-Za-z0-9]",
    "replacement": " "
}

对于实现此目标的任何新替代方案的任何反馈,我都很感激。理想情况下,解决方案不仅涵盖 ® 和 ™。

您正在寻找的是 html strip char filter,它不仅适用于两个符号,而且适用于广泛的 html 个字符。

工作示例

使用 html strip 字符过滤器的索引映射

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "char_filter": [
                        "html_strip"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

在该文档中仅使用 (™) 索引示例文档。

PUT 71622637/_doc/1

{
   "title" : "™"
}

搜索其 html 编码版本

{
    "query" :{
        "match" : {
            "title" : "&trade"
        }
    }
}

And search result

"hits": [
            {
                "_index": "71622637",
                "_id": "1",
                "_score": 0.89701396,
                "_source": {
                    "title": "™"
                }
            }
        ]

与此类似,搜索商标符号

{
    "query" :{
        "match" : {
            "title" : "™"
        }
    }
}

And search result

"hits": [
            {
                "_index": "71622637",
                "_id": "1",
                "_score": 0.89701396,
                "_source": {
                    "title": "™"
                }
            }
        ]