Elasticsearch 添加同义词分析器后区分大小写

Elasticsearch Became case sensitive after add synonym analyzer

我将同义词分析器添加到 my_index 后,索引变得区分大小写

我有一个名为 nationality 的 属性,它有 synonym analyzer。但是好像这个属性因为同义词分析器变成了case sensitive

这是我的 /my_index/_mappings

{
  "my_index": {
    "mappings": {
      "items": {
        "properties": {
          .
          .
          .
          "nationality": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "analyzer": "synonym"
          },
          .
          .
          .
        }
      }
    }
  }
}

在索引中,我有单词 India COUNTRY。当我尝试使用下面的命令搜索 India nation 时,我将得到结果。

POST /my_index/_search
{
  "query": {
    "match": {
      "nationality": "India nation"
    }
  }
}

但是,当我搜索 india(注意字母 i 是小写的)时,我什么也得不到。 我的假设是,发生这种情况是因为我在 synonym 之前放置了 uppercase 过滤器。我这样做是因为同义词是大写的。因此查询 India 将在通过此过滤器后变为 INDIA

这是我的 /my_index/_settings

{
  "my_index": {
    "settings": {
      "index": {
        "number_of_shards": "1",
        "provided_name": "my_index",
        "similarity": {
          "default": {
            "type": "BM25",
            "b": "0.9",
            "k1": "1.8"
          }
        },
        "creation_date": "1647924292297",
        "analysis": {
          "filter": {
            "synonym": {
              "type": "synonym",
              "lenient": "true",
              "synonyms": [
                "NATION, COUNTRY, FLAG"
              ]
            }
          },
          "analyzer": {
            "synonym": {
              "filter": [
                "uppercase",
                "synonym"
              ],
              "tokenizer": "whitespace"
            }
          }
        },
        "number_of_replicas": "1",
        "version": {
          "created": "6080099"
        }
      }
    }
  }
}

有什么方法可以使 属性 仍然不区分大小写。我找到的所有解决方案只表明我应该只将 nationality 内的所有文本设置为小写或大写。但是如果我在索引中有大写和小写字母怎么办?

将数据添加到索引后是否应用了同义词过滤器?

如果是,可能“India COUNTRY”短语被索引为“India COUNTRY”。当您向索引发送匹配查询时,您的查询被分析并作为“INDIA COUNTRY”发送,因为您不再有大写过滤器,它被匹配是因为您正在使用匹配查询,它足以匹配其中一个词。 “国家/地区”一词提供了这一点。

但是,当您发送一个单词查询“india”时,由于您的大写过滤器,它会被分析并转换为“INDIA”,但您的索引中没有任何匹配的单词。您只有一个文档包含“India COUNTRY”。

我的回答有一点假设。希望对理解您的问题有所帮助。

我找到了解决办法!

我没有意识到我在 settings 中应用的过滤器在更新和搜索数据时适用。一开始,我做了这一步:

  1. 使用同义词过滤器创建索引
  2. 插入数据
  3. 在同义词过滤器前添加 uppercase

这样,uppercase 过滤器就不会应用于我的数据。我应该做的是:

  1. 使用uppercase & synonym过滤器创建索引(注意顺序)
  2. 插入数据 然后过滤器将应用于我的数据。