为什么搜索会忽略同义词?

Why search ignores synonyms?

我想搜索一个短语并获得所有结果(包括同义词结果)。

我的索引配置如下:

         "settings": {
            "index": {
                "analysis": {
                    "filter": {
                        "my_graph_synonyms": {
                            "type": "synonym_graph",
                            "synonyms": [
                                "Cosmos, Universe",
                            ]
                        }
                    },
                    "analyzer": {
                        "my_search_time_analyzer": {
                            "tokenizer": "standard",
                            "filter": [
                                "lowercase",
                                "stemmer",
                                "my_graph_synonyms"
                            ]
                        }
                    }
                }
            }
        },
        "mappings": {
            "properties": {
                "content": {
                    "type": "text",
                    "analyzer": "standard",
                    "search_analyzer": "my_search_time_analyzer"
                }
            }
        }

我在索引中添加了 2 个文档:

PUT demo_idx/_doc/1
{
  "content": "Cosmos A Spacetime Odyssey is a 2014 American science documentary television series."
}

PUT demo_idx/_doc/2
{
  "content": "Universe A Spacetime Odyssey is a 2014 American science documentary television series."
}

我运行以下搜索:

"query": {
            "bool": {
                "must":
                    [{
                        "match": {
                            "content": {
                                "query": "Cosmos",
                            }
                        }
                    }]
            }
        } 

我希望得到 2 个结果(在同义词之后)但我只得到一个。

如何 运行 搜索查询(同时使用同义词)并获得 2 个结果?

这是由于 stemmer 过滤器造成的,如果您删除它并再次为您的数据编制索引,它将 return 你们两个文件,

您可以使用 analyze API 检查分析器生成的标记,您可以看到 Cosmos 它生成以下标记

{
    "tokens": [
        {
            "token": "univers", // Note this
            "start_offset": 0,
            "end_offset": 6,
            "type": "SYNONYM",
            "position": 0
        },
        {
            "token": "cosmo",
            "start_offset": 0,
            "end_offset": 6,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

虽然在索引时使用的 standard 分词器会为 Universe 创建 Universe 而不会阻止它,因此它与 [=16= 生成的搜索词不匹配].