在 Elasticsearch 上保留非词干标记

Keep non-stemmed tokens on Elasticsearch

当我在 Elasticsearch 上索引文档时,我正在使用词干分析器(针对巴西葡萄牙语)。这是我的默认分析器的样子(这里有 nvm 小错误,因为我已经从服务器中的代码中手动复制了它):

"analysis":{
    "filter":{
        "my_asciifolding": {
            "type":"asciifolding",
            "preserve_original":true,   
        },
        "stop_pt":{
            "type": "stop",
                "ignore_case": true,
                "stopwords": "_brazilian_"
        },
        "stemmer_pt":{
            "type":"stemmer",
            "language":"brazilian"
        }
    },
    "analyzer":{
        "default":{
            "type":"custom",
            "tokenizer":"standard",
            "filter":{
                "lowercase",
                "my_asciifolding",
                "stop_pt",
                "stemmer_pt"
            }   
        }
    }
} 

我还没有真正触及我的类型映射(除了我声明的几个数字字段 "type":"long")所以我希望大多数字段都使用我在上面指定的默认分析器。

这按预期工作,但问题是一些用户感到沮丧,因为(因为令牌被阻止),查询 "vulnerabilities" 和查询 "vulnerable" return 相同的结果,这是一种误导,因为他们期望具有完全匹配的结果排在第一位。

在 elasticsearch 中执行此操作的默认方式(如果有)是什么? (也许在索引中保留无词干的标记以及有词干的标记?)我使用的是 1.5.1 版。

我最终使用 "fields" 字段以不同方式索引我的属性。不确定这是否是最优的,但这是我现在处理它的方式:

  • 添加另一个分析器(我称之为 "no_stem_analyzer"),其中包含 "default" 分析器具有的所有过滤器,减去 "stemmer".

  • 对于我想同时保留非词干和词干变体的每个属性,我这样做了(字段 "DESCRIPTION" 的示例):

    "mappings":{
      "_default_":{
        "properties":{
          "DESCRIPTION":{
            "type"=>"string",
            "fields":{
              "no_stem":{
                "type":"string",
                "index":"analyzed",
                "analyzer":"no_stem_analyzer"
              },
              "stemmed":{
                "type":"string",
                "index":"analyzed",
                "analyzer":"default"                
              }
            }
          } 
        },//.. other attributes here
      }
    }  
    

在搜索时(使用 query_string_query)我还必须指出(使用字段 "fields")我想搜索所有子字段(例如 "DESCRIPTION.*"

我的方法也基于[这个答案]。()