【问题标题】:One way synonym search in ElasticsearchElasticsearch 中的一种同义词搜索方式
【发布时间】:2015-12-17 11:29:20
【问题描述】:

我想在 Elasticsearch 中实现同义词单向搜索。一种方式搜索意味着如果我定义 a => x,y,z 并搜索“a”,搜索结果应该包括所有包含单词 x,y,z,a 的文档,这些文档现在正在工作。但如果我搜索“x”,则搜索结果应该包含仅包含“x”而不包含“a”的文档。

这在 Elasticsearch 中可行吗?

【问题讨论】:

    标签: elasticsearch type-synonyms


    【解决方案1】:

    您不能在同义词关系中执行此操作,因为您要解释的行为是 hyperonym/hyponym 关系。

    您可以在index-time 上实现这样的行为。

    因此,对于a 的每次出现,您还可以索引x,y,z。为此使用一个额外的字段将是一个好主意,以免弄乱分数。

    遗憾的是,这种行为不是 elasticsearch 的一部分,必须在提供数据时手动实现。

    【讨论】:

      【解决方案2】:

      我通过反转同义词表达式实现了单向同义词:

      例如:

      Robert => Bob, Rob
      Bob => Robert
      

      但是我不得不使用这个带有同义词的分析器是不同的方式。 在映射中,同义词与一个新字段挂钩:

      "FirstName": {
        "type": "string",
        "analyzer": "standard",
        "search_analyzer": "standard",
        "fields": {
          "raw": {
            "type": "string",
            "analyzer": "standard"
          },
          "synonym": {
            "type": "string",
            "analyzer": "firstname_synonym_analyzer"
          }
        }
      },
      

      搜索看起来像这样:

       "bool": {
          "should": [
             {
                "match": {
                   "FirstName": {
                      "query": "Jo"
                   }
                }
             },
             {
                "match": {
                   "FirstName.synonym": {
                      "query": "Jo"
                   }
                }
             }
          ],
          "minimum_should_match": 1
       }
      

      这样第一个字段包含正常值,第二个只是可能的同义词。所以寻找Bob 会找到Robert,但不会找到Rob

      【讨论】:

        【解决方案3】:

        我会使用generic expansion aka genre expansion 和不同的索引时间和查询时间分析器来实现它

        索引时间的同义词:

        Bob => Bob, Robert
        Rob => Rob, Robert
        

        格式是这样的

        word => the same word, more generic word, even more generic, etc
        

        查询时间:未应用同义词

        查询“Bob”将只返回“Bob”所在的文档。

        查询“Rob”将只返回“Rob”所在的文档。

        查询“Robert”将返回“Bob”、“Rob”和“Robert”所在的文档。

        【讨论】:

        • 在您的情况下,“a”是最通用的术语,因此定义类似于 x=> x, a; y => y, a; z => z, a
        猜你喜欢
        • 2016-03-19
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 2016-08-11
        相关资源
        最近更新 更多