在 ElasticSearch 中搜索包含破折号和 space 的子字符串

Search for sub string that contains dash and space in EleasticSearch

我有一个这样的模型:

public class PersonModel
{
    public Guid Id { get; set; }

    public PersonageType Type { get; set; }

    public string Name { get; set; }

    public string NationalCode { get; set; }

    public string BourseCode { get; set; }
}

我正在尝试执行查询以过滤与每个 属性:

的子字符串匹配的数据

var result = await ElasticClient.SearchAsync<PersonModel>(sd => sd
    .Index(IndexName)
    .From((pagination.PageNumber - 1) * pagination.PageSize)
    .Size(pagination.PageSize)
    .Query(q =>
        +q.Match(m => m.Field(f => f.Type).Query(typeValue)) &&
        +q.Wildcard(w => w.Field(f => f.NationalCode).Value(nationalCode == null ? null : $"*{nationalCode}*")) &&
        +q.Wildcard(w => w.Field(f => f.Name).Value(name == null ? null : $"*{name}*")) &&
        +q.Wildcard(w => w.Field(f => f.BourseCode).Value(bourseCode == null ? null : $"*{bourseCode}*"))));

此查询工作正常,但当每个值包含 -white space 时,将不会返回任何内容。例如,我有一个名为 john doe 的人,当 name 值为 hn d 时,搜索查询不起作用。

解决此问题的最简单方法是更改​​映射。 尝试如下操作:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "NationalCode": {
        "type":  "keyword"
      },
      "Name": {
        "type":  "keyword"
      },
      "BourseCode": {
        "type":  "keyword"
      },
    }
  }
}

然后重新索引您的数据。

了解更多信息: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

我认为您使用的是文本字段数据类型。另外,如果您想使用匹配查询并享受它的好处,您可以同时输入以下内容:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "NationalCode": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}

然后您可以对 NationalCode 使用匹配查询,对 NationalCode.keyword

使用通配符查询

正如@hamid 所说 keyword 解决了问题,我将查询更改为:

var result = await ElasticClient.SearchAsync<PersonageSearchReadModel>(sd => sd
    .Index(IndexName)
    .From((pagination.PageNumber - 1) * pagination.PageSize)
    .Size(pagination.PageSize)
    .Query(q =>
        +q.Match(m => m.Field(f => f.Type).Query(typeValue)) &&
        +q.Wildcard(w => w.Field(f => f.NationalCode.Suffix("keyword")).Value(nationalCode == null ? null : $"*{nationalCode}*")) &&
        +q.Wildcard(w => w.Field(f => f.Name.Suffix("keyword")).Value(name == null ? null : $"*{name}*")) &&
        +q.Wildcard(w => w.Field(f => f.BourseCode.Suffix("keyword")).Value(bourseCode == null ? null : $"*{bourseCode}*"))));