可以用Asciifolding进行术语查询吗?

时间:2019-08-12 18:42:45

标签: elasticsearch

我需要匹配整个字段,但要使用小写和asiifolding令牌过滤器。在Elasticsearch中有可能吗?

例如,如果我有一个产品的“标题”字段,并且产品标题是“ PotovalniKovček”。并且用户搜索查询为“ potovalni kovcek”,那么我需要返回此产品作为结果。但前提是整个标题与搜索查询匹配。如果用户搜索查询是“ potovalni”,“ Potovalni”或“ kovcek”,则不会返回任何结果。

我可以使用小写字母和asiifolding令牌过滤器创建术语查询吗?我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

我要做的是将title字段定义为keyword,并使用custom normalizer来完成这项工作。

首先让我们创建索引:

PUT test
{
  "settings": {
    "analysis": {
      "normalizer": {
        "exact": {
          "type": "custom",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "keyword",
          "normalizer": "exact"
        }
      }
    }
  }
}

然后,我们为示例文档建立索引:

PUT test/doc/1
{
  "title": "Potovalni Kovček"
}

最后,我们可以搜索:

# Record 1 is returned
POST test/_search 
{
  "query": {
    "term": {
      "title": "Potovalni Kovček" 
    }
  }
}

# Record 1 is returned
POST test/_search 
{
  "query": {
    "term": {
      "title": "potovalni kovcek" 
    }
  }
}

# No record is returned
POST test/_search 
{
  "query": {
    "term": {
      "title": "potovalni" 
    }
  }
}

# No record is returned
POST test/_search 
{
  "query": {
    "term": {
      "title": "kovcek" 
    }
  }
}