Elasticsearch - 如何在使用小写过滤器的同时保留大写首字母缩略词?

3
在 Elasticsearch 2.x 中,如果我仍然想使用“lowercase”过滤器(用于实现大小写不敏感的搜索),但需要区分首字母缩写“CAN”和普通英语单词“can”,该怎么办?
我正在使用的自定义分析器如下:
"analyzer": {
    "tight": {
        "type": "custom",
        "tokenizer": "standard",
        "stopwords": "_english_",
        "filter": ["lowercase", "asciifolding"]
    }
}

在索引时间,当大写首字母缩写“CAN”被我的分析器处理时,它会变成英语单词“can”。然后当我搜索“CAN”时,我会得到所有包含英语单词“can”的文档。我只想要包含大写单词“CAN”的文档。可能还有其他缩写符合类似的模式。

如何解决这个问题?

1个回答

1
一种实现的方法是创建另一个分析器,不使用lowercase令牌过滤器,并在主字段的子字段上使用该分析器。操作如下:
创建一个具有两个分析器tighttight_acronym的索引。前者被分配给field,后者被分配给field.acronyms子字段:
PUT index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "tight": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        },
        "tight_acronym": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "field": {
          "type": "string",
          "analyzer": "tight",
          "fields": {
            "acronyms": {
              "type": "string",
              "analyzer": "tight_acronym"
            }
          }
        }
      }
    }
  }
}

然后我们索引了两个文档:
PUT index/test/1
{ "field": "It is worth CAN 300" }
PUT index/test/2
{ "field": "can you do it?" }

如果你搜索子字段中的CAN,你将获得第一个文档。

POST index/test/_search
{
  "query": {
    "match": {
      "field.acronyms": "CAN"
    }
  }
}

如果你在主搜索框中搜索can,你将得到第二个文档。

POST index/test/_search
{
  "query": {
    "match": {
      "field": "can"
    }
  }
}

我看到的第一个问题是,你还需要使用小写过滤器搜索字段,以进行不区分大小写的匹配,这意味着首字母缩略词“CAN”将始终符合第一个条件。我正在研究的解决方案是添加一个字符过滤器,将缩略词“CAN”替换为“ccaann”,然后在我的代码中有一个缩略词替换列表,将任何出现的缩略词替换为它们的小写等效形式。 - Redtopia
1
可以。如果您选择这条路线,我建议使用同义词token过滤器,这样您就不需要修改客户端代码了。您只需精选您的同义词文件即可。 - Val
这是一个有趣的想法。所以如果CAN最终被索引为“ccaann”,那么我的同义词就是“CAN,ccaann”,对吗? - Redtopia
1
是的,没错。你还需要确保 ignore_case 设置为 false,否则 canCAN 将被视为相同。 - Val

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接