在Elasticsearch上保留非词干标记

时间:2015-05-17 18:10:53

标签: elasticsearch information-retrieval

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

"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&# 34;返回相同的结果,这会产生误导,因为他们希望将具有完全匹配的结果排在第一位。

什么是弹性搜索中的默认方式(如果有的话)? (也许保留索引中的未受干扰的令牌以及带有令牌的令牌?)我使用的是版本1.5.1。

1 个答案:

答案 0 :(得分:0)

我最终使用"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.*"

我的方法也基于[这个答案]。(elasticsearch customize score for synonyms/stemming