使用c#nest client在elasticsearch文档的所有字段中搜索输入关键字

时间:2015-06-27 09:01:57

标签: c# .net search elasticsearch nest

我有一个嵌套的弹性搜索文档,我想在该文档的所有字段中搜索,即我想在顶级和嵌套字段中搜索。我的索引名称为people,我的类型名称为person 我的文件看起来像这样:

{
"id": 1,
"fname": "elizabeth",
"mname": "nicolas",
"lname": "thomas",
"houseno": "beijing",
"car": [
          {
             "carname": "audi",
             "carno": 4444,
             "color": "black"
          },
          {
             "carname": "mercedez",
             "carno": 5555,
             "color": "pink"
          }
      ]
}   

然后我在.net中有以下查询,它实际上在elasticsearch文档中搜索user input keyword。基本上,我想搜索文档的每个字段。我在查询中使用inner_hits,这样我只能返回匹配的嵌套文档 我将我的查询设计为:

var result = client.Search<person>
                (s => s
                .From(from)
                .Size(size)
                .Source(false)
                .Query(query => query.Filtered(filtered => filtered
                .Query(q => q.MatchAll())
                .Filter(f => f.Nested(nf => nf
                .InnerHits()
                .Path(p => p.car)
                .Query(qq => qq.Match(m => m.OnField(g =>  g.car.First().carname).Query(searchKeyword))))))));  

我在head插件中使用的相应JSON查询是:

POST-people/person/_search:
{
"_source":false,
"query": {
  "filtered": {
    "query": {"match_all": {}},
      "filter": {
      "nested": {
      "path": "car",
      "filter": {
        "term": {
          "car.carname": "searchKeyword"
        }
      }, 
      "inner_hits" : {}
    }
   }
  }
 }
}  

但我想搜索所有字段(id,fname,mname,lname,houseno,carname,carno,color),而不只是在单个字段中搜索,例如在carname中,就像我在上面的查询中所做的那样 另外,我希望像partial searching一样%xyz% 我怎么能这样做?
任何人都可以帮我修改这个查询,以便我可以使用这个单一查询在所有字段中搜索以及进行部分搜索吗? 我是弹性搜索和.net的新手,所以我会感谢任何帮助。

1 个答案:

答案 0 :(得分:-1)

您是否尝试使用Query代替OnField方法?

我的意思是,以这种方式查询:

var result = client.Search<person>
            (s => s
            .From(from)
            .Size(size)
            .Source(false)
            .Query(query => query.Filtered(filtered => filtered
            .Query(q => q.MatchAll())
            .Filter(f => f.Nested(nf => nf
            .InnerHits()
            .Path(p => p.car)
            .Query(qq => qq.Match(m => m.Query(searchKeyword)))))))); 
相关问题