1

让我直接跳到代码。

PUT /test_1
{
  "settings": {
    "analysis": {
      "filter": {
        "synonym": {
          "type": "synonym",
          "synonyms": [
            "university of tokyo => university_of_tokyo, u_tokyo",
            "university" => "college, educational_institute, school"
          ],
          "tokenizer": "whitespace"
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "whitespace",
          "filter": [
            "shingle",
            "synonym"
          ]
        }
      }
    }
  }
}

输出

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Token filter [shingle] cannot be used to parse synonyms"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Token filter [shingle] cannot be used to parse synonyms"
  },
  "status": 400
}


基本上,
假设我有以下 index_time 同义词

"university => university, college, educational_institute, school"
"tokyo => tokyo, japan_capitol"
"university of tokyo => university_of_tokyo, u_tokyo"

如果我搜索“大学”,我希望匹配“东京大学”,
但由于索引仅包含“东京大学”=> university_of_tokyo, u_tokyo .....搜索失败


我期待如果我使用分析器{'filter': ["single", "synonym"]}

university of tokyo -shingle-> university -synonyms-> college, institue


如何获得所需的行为?

4

2 回答 2

0

根据这个链接Tokenizers 应该在同义词过滤器之前生成单个标记。

但是首先要回答您的问题,您的第二条规则应该修改为这样,以使所有术语成为同义词

university , college, educational_institute, school

第二因为第一条规则(university_of_tokyo)尾部的下划线,所有出现的“东京大学”都被索引为university_of_tokyo,它不知道它是单个标记。为了克服这个问题,我建议使用具有如下规则的 char 过滤器:

university of tokyo => university_of_tokyo university of tokyo

然后在你的同义词规则中:

university_of_tokyo , u_tokyo

这也是一种处理多词同义词问题的方法。

于 2020-09-30T10:13:15.920 回答
0

尽管我使用的是同义词图,但我遇到了类似的错误....

我尝试在同义词图定义中使用 lenient=true 并摆脱了错误。不知道有没有坏处......

 "graph_synonyms" : {
                        "lenient": "true",       
                        "type" : "synonym_graph",
                        "synonyms_path" : "synonyms.txt"
            },
于 2020-07-09T16:08:52.270 回答