有时,我们想知道某个同义词是否真正匹配了我们的 Elastic 查询。下面我们使用 named queries + include_named_queries_score 来进行展示。使用和不使用 synonym analyzer 运行相同的 match,返回的分数会告诉你该同义词是否对相关性产生了贡献。
第 1 步,添加 analyzer、filter、mappings
PUT relevance-test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"synonyms_filter"
]
}
},
"filter": {
"synonyms_filter": {
"type": "synonym",
"synonyms": [
"rd, road"
]
}
}
}
},
"mappings": {
"properties": {
"address": {
"type": "text"
}
}
}
}
第 2 步,创建测试索引
PUT relevance-test/_bulk
{"index": {"_id": 1}}
{"address": "123 supercool road"}
第 3 步,测试正常词语搜索
POST relevance-test/_search/template?include_named_queries_score
{
"source": {
"query": {
"bool": {
"should": [
{
"match": {
"address": {
"_name": "with_synonyms",
"query": "{{search_term}}",
"analyzer": "my_analyzer"
}
}
},
{
"match": {
"address": {
"_name": "without_synonyms",
"query": "{{search_term}}"
}
}
}
]
}
}
},
"params": {
"search_term": "123 supercool road"
}
}

在我们的测试中,我们使用 "123 supercool road" 来进行测试。我们并没有使用到简写的 rd 同义词来进行测试。上面显示使用同义词和没有使用同义词的分数都是一样的。
第 4 步,使用同义词来进行测试
POST relevance-test/_search/template?include_named_queries_score
{
"source": {
"query": {
"bool": {
"should": [
{
"match": {
"address": {
"_name": "with_synonyms",
"query": "{{search_term}}",
"analyzer": "my_analyzer"
}
}
},
{
"match": {
"address": {
"_name": "without_synonyms",
"query": "{{search_term}}"
}
}
}
]
}
}
},
"params": {
"search_term": "123 supercool rd"
}
}

在上面,我们使用 "123 supercool rd" 来进行测试。很显然,最终的结果显示使用的是使用同义词贡献的分数更大。

希望,这篇文章能对你检测同义词是否工作有所帮助。