有时,我们想知道某个同义词是否真正匹配了我们的 Elastic 查询。下面我们使用 named queries + include_named_queries_score 来进行展示。使用和不使用 synonym analyzer 运行相同的 match,返回的分数会告诉你该同义词是否对相关性产生了贡献。
第 1 步,添加 analyzer、filter、mappings
`
1. PUT relevance-test
2. {
3. "settings": {
4. "analysis": {
5. "analyzer": {
6. "my_analyzer": {
7. "type": "custom",
8. "tokenizer": "standard",
9. "filter": [
10. "synonyms_filter"
11. ]
12. }
13. },
14. "filter": {
15. "synonyms_filter": {
16. "type": "synonym",
17. "synonyms": [
18. "rd, road"
19. ]
20. }
21. }
22. }
23. },
24. "mappings": {
25. "properties": {
26. "address": {
27. "type": "text"
28. }
29. }
30. }
31. }
`AI写代码
第 2 步,创建测试索引
`
1. PUT relevance-test/_bulk
2. {"index": {"_id": 1}}
3. {"address": "123 supercool road"}
`AI写代码
第 3 步,测试正常词语搜索
`
1. POST relevance-test/_search/template?include_named_queries_score
2. {
3. "source": {
4. "query": {
5. "bool": {
6. "should": [
7. {
8. "match": {
9. "address": {
10. "_name": "with_synonyms",
11. "query": "{{search_term}}",
12. "analyzer": "my_analyzer"
13. }
14. }
15. },
16. {
17. "match": {
18. "address": {
19. "_name": "without_synonyms",
20. "query": "{{search_term}}"
21. }
22. }
23. }
24. ]
25. }
26. }
27. },
28. "params": {
29. "search_term": "123 supercool road"
30. }
31. }
`AI写代码
在我们的测试中,我们使用 “123 supercool road” 来进行测试。我们并没有使用到简写的 rd 同义词来进行测试。上面显示使用同义词和没有使用同义词的分数都是一样的。
第 4 步,使用同义词来进行测试
`
1. POST relevance-test/_search/template?include_named_queries_score
2. {
3. "source": {
4. "query": {
5. "bool": {
6. "should": [
7. {
8. "match": {
9. "address": {
10. "_name": "with_synonyms",
11. "query": "{{search_term}}",
12. "analyzer": "my_analyzer"
13. }
14. }
15. },
16. {
17. "match": {
18. "address": {
19. "_name": "without_synonyms",
20. "query": "{{search_term}}"
21. }
22. }
23. }
24. ]
25. }
26. }
27. },
28. "params": {
29. "search_term": "123 supercool rd"
30. }
31. }
`AI写代码
在上面,我们使用 “123 supercool rd” 来进行测试。很显然,最终的结果显示使用的是使用同义词贡献的分数更大。
希望,这篇文章能对你检测同义词是否工作有所帮助。