首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用elasticsearch正确处理多词同义词扩展?

如何使用elasticsearch正确处理多词同义词扩展?
EN

Stack Overflow用户
提问于 2019-05-01 23:53:13
回答 1查看 1.1K关注 0票数 2

我有以下同义词扩展:

代码语言:javascript
复制
suco => suco, refresco, bebida de soja

我想要的是这样标记搜索:

搜索"suco de laranja“将被标记为"suco”、"laranja“、"refresco”、"bebida de soja“。

但是我把它标记为"suco","laranja","refresco","bebida","soja“。

考虑一下"de“这个词是一个停止词。我希望在查询中忽略它,比如"bebida de laranja“变成"bebida","laranja”。但是我不希望它在同义词标记化上被考虑,所以"bebida de soja“仍然是一个标记"bebida de soja”。

我的设置:

代码语言:javascript
复制
{
    "settings":{
        "analysis":{
            "filter":{
                "synonym_br":{
                    "type":"synonym",
                    "synonyms":[
                        "suco => suco, refresco, bebida de soja"
                    ]
                },
                "brazilian_stop":{
                    "type":"stop",
                    "stopwords":"_brazilian_"
                }
            },
            "analyzer":{
                "synonyms":{
                    "filter":[
                        "synonym_br",
                        "lowercase",
                        "brazilian_stop",
                        "asciifolding"
                    ],
                    "type":"custom",
                    "tokenizer":"standard"
                }
            }
        }
    }
}
EN

Stack Overflow用户

发布于 2019-05-02 03:45:26

我建议你做以下两项修改。第一个问题与你提出的问题直接相关,第二个问题是建议。

  1. 不要使用多个同义词的扩展,相反,所有的同义词都指向一个单词的同义词。因此,将"suco => suco, refresco, bebida de soja"更改为"suco, refresco, bebida de soja => suco"
  2. 更改synonyms分析器中过滤器的顺序。将lowercase置于synonym_br之前。这将确保这种情况不会影响synonym_br令牌筛选器。

因此,最终设置为:

代码语言:javascript
复制
{
  "settings": {
    "analysis": {
      "filter": {
        "synonym_br": {
          "type": "synonym",
          "synonyms": [
            "suco, refresco, bebida de soja => suco"
          ]
        },
        "brazilian_stop": {
          "type": "stop",
          "stopwords": "_brazilian_"
        }
      },
      "analyzer": {
        "synonyms": {
          "filter": [
            "lowercase",
            "synonym_br",
            "brazilian_stop",
            "asciifolding"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}

这是怎么回事?

对于输入bebida de soja过滤器,按以下顺序应用:

代码语言:javascript
复制
Input Filter        Result tokens
====================================
lowercase           bebida, de, soja
synonym_br          suco             <------- all the above tokens(including position) exactly matches a synonym
brazilian_stop      suco
asciifolding        suco

让我们看看brazilian_stop在起作用。为此,我们需要一个与同义词不匹配但其中包含de的输入。例如de soja

代码语言:javascript
复制
Input Filter        Result tokens
=================================
lowercase           de, soja
synonym_br          de, soja  <------- none of the tokens (independently or combined(including position)) matches any synonym
brazilian_stop      soja      <------- de is removed as it is a stopword
asciifolding        soja
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55944061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档