微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 ElasticSearch 中搜索包含破折号和空格的子字符串

我有一个这样的模型:

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}*"))));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?