elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

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

C# 在EleasticSearch中搜索包含破折号和空格的子字符串,c#,elasticsearch,nest,C#,elasticsearch,Nest,我有一个这样的模型: 公共类PersonModel { 公共Guid Id{get;set;} 公共PersonageType类型{get;set;} 公共字符串名称{get;set;} 公共字符串国家代码{get;set;} 公共字符串布尔secode{get;set;} } 我正在尝试实现一个查询,以筛选与每个属性的子字符串匹配的数据: var result=await ElasticClient.SearchAsync(sd=>sd .Index(索引名) .From((paginat

我有一个这样的模型:

公共类PersonModel
{
公共Guid Id{get;set;}
公共PersonageType类型{get;set;}
公共字符串名称{get;set;}
公共字符串国家代码{get;set;}
公共字符串布尔secode{get;set;}
}
我正在尝试实现一个查询,以筛选与每个属性的子字符串匹配的数据:


var result=await ElasticClient.SearchAsync(sd=>sd
.Index(索引名)
.From((pagination.PageNumber-1)*pagination.PageSize)
.Size(分页.PageSize)
.Query(q=>
+q、 匹配(m=>m.Field(f=>f.Type).Query(typeValue))&&
+q、 通配符(w=>w.Field(f=>f.NationalCode).Value(NationalCode==null?null:$“*{NationalCode}*”)&&
+q、 通配符(w=>w.Field(f=>f.Name).Value(Name==null?null:$“*{Name}*”)&&
+q、 通配符(w=>w.Field(f=>f.BourseCode).Value(BourseCode==null?null:$“*{BourseCode}*”);

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

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

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "NationalCode": {
        "type":  "keyword"
      },
      "Name": {
        "type":  "keyword"
      },
      "BourseCode": {
        "type":  "keyword"
      },
    }
  }
}
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "NationalCode": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}
然后重新编制数据索引

有关更多信息:

我认为您使用的是文本字段数据类型。此外,如果您想使用match query并享受其好处,您可以使用以下两种类型:

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

然后您可以对
NationalCode
使用匹配查询,对
NationalCode使用通配符查询。关键字

正如@hamid所说的
关键字
修复了问题,我将查询改为:

var result=wait ElasticClient.SearchAsync(sd=>sd)
.Index(索引名)
.From((pagination.PageNumber-1)*pagination.PageSize)
.Size(分页.PageSize)
.Query(q=>
+q、 匹配(m=>m.Field(f=>f.Type).Query(typeValue))&&
+q、 通配符(w=>w.Field(f=>f.NationalCode.Suffix(“关键字”))).Value(NationalCode==null?null:$“*{NationalCode}*”)&&
+q、 通配符(w=>w.Field(f=>f.Name.Suffix(“关键字”)).Value(Name==null?null:$“*{Name}*”)&&
+q、 通配符(w=>w.Field(f=>f.BourseCode.Suffix(“关键字”)).Value(BourseCode==null?null:$“*{BourseCode}*”));

能否以JSON格式共享一些示例数据和预期的搜索结果?问题出在标准analyzer中,并且使用通配符查询(此问题的回答次数太多)。如果您坚持使用通配符查询,则应使用“关键字”映射类型。否则,请描述您想要做什么,以便我们可以帮助您重新设计映射和查询。@hamid如果您能给我发送一个解决此问题的链接,那就太好了。我只想在SQL Server中编写一个类似于%like%的查询,使用通配符对我来说没有什么区别