在弹性搜索中寻找不返回T恤的T恤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在弹性搜索中寻找不返回T恤的T恤相关的知识,希望对你有一定的参考价值。

我正在使用elasticSearch的以下设置和映射

{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 10
        },
        "synonym_filter": {
          "type": "synonym",
          "synonyms":[
            "yoga,fit-sports,blue",
            "tshirt,tees,t-shirt "
          ]
        }
      },
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "synonym_filter",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "products": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          },
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
  }
}

我索引了一个字段“名称:公主印花T恤”。

正如我使用空白分析器,es创建像“T恤”的标记。但是为了搜索我正在使用“search_analyzer”:“标准”我认为这个查询就像“公主印花T恤”,这个“T恤”将不匹配,因此会给出空搜索结果。我身边的一个解决方案就像添加“T恤,T恤”这样的同义词。然后我会得到结果。但在这种情况下,如果我们搜索“衬衫”,它将返回“T恤和衬衫”,这是不可接受的。如果我没有使用这个“search_analyzer”:“标准”我没有得到预期的结果。如果我搜索“T恤”,我只需要搜索结果

答案

Problem description

有问题的部分就像你已经描述过的"search_analyzer": "standard"

这将把T-shirt的每个条目转换为令牌tshirt。索引中的数据看起来像t-shirtt-shir等,并且不匹配。

Possible solution

适应搜索分析器

您需要确保查询是小写的,在空白处拆分。因此,您可以使用whitespace analyzer https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-analyzer.html结合小写分析器定义查询时间的自定义分析器。

以上是关于在弹性搜索中寻找不返回T恤的T恤的主要内容,如果未能解决你的问题,请参考以下文章

2000多一件的大牌T恤,真实成本有多少?

提升技能,升级思维,你学知识我送T恤,订阅专栏免费领51CTO定制T恤

RMB:159 Chrome Heart 经典印花T恤

PHP 之神(PHP God)专属T恤-Pro 款

全球限量HarmonyOS周边数字头像卫衣长袖T恤开箱!

全球限量HarmonyOS周边数字头像卫衣长袖T恤开箱!