如何在弹性搜索文本搜索中匹配部分单词

亚历山大·索洛尼克

name我的弹性搜索中有一个字段,其值为Single V

现在,如果我用Sor的值搜索它Sing,我不会得到任何结果,但是如果我输入一个完整的值Single,那么我会得到结果Single V,我使用的查询如下:-

{
  "query": {
    "match": {
      "name": "singl"
    }
  },
  "sort": []
}

这没有给我任何结果,我是否需要更改名称或分析器的映射/设置?

编辑:-

我正在尝试使用以下映射/设置创建以下索引

PUT my_cars
{
  "settings": {
    "analysis": {
      "normalizer": {
        "sortable": {
          "filter": ["lowercase"]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        },
        "tokenizer": {
          "my_tokenizer": {
            "type": "ngram",
            "min_gram": 1,
            "max_gram": 36,
            "token_chars": [
              "letter"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "sortable"
          }
        }
      }
    }
  }
}

但我收到以下错误

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "analyzer [tokenizer] must specify either an analyzer type, or a tokenizer"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "analyzer [tokenizer] must specify either an analyzer type, or a tokenizer"
  },
  "status" : 400
}
编码器

如果未指定分析器,则Elasticsearch 默认为该text字段使用标准分析器这将标记"Single V""single""v"因此,您得到的"Single"是其他术语的结果,而不是其他术语。

如果要进行部分搜索,可以使用边缘 n-gram 标记器通配符查询

Edge n-gram 分词器的映射是

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 6,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    },
    "max_ngram_diff": 10
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

更新 1:

在上面给出的索引映射中,}缺少一个括号修改您的索引映射,如下所示

{
  "settings": {
    "analysis": {
      "normalizer": {
        "sortable": {
          "filter": [
            "lowercase"
          ]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }                                 
      },                                    // note this
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 36,
          "token_chars": [
            "letter"
          ]
        }
      }
    },
    "max_ngram_diff": 50
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "sortable"
          }
        }
      }
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章