【发布时间】:2015-06-23 08:43:30
【问题描述】:
我正在尝试使用 NEST c# 客户端搜索我的 elasticsearch 嵌套对象。
我的索引名称是people,我的类型是person,其中car 字段是nested。
这是我的课:
using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebApplication5
{
public class person
{
public int id { get; set; }
public String fname { get; set; }
public String mname { get; set; }
public String lname { get; set; }
public String houseno { get; set; }
[ElasticProperty(Type = FieldType.Nested)]
public IList<NestedType> car { get; set; }
public class NestedType
{
public String carname { get; set; }
public int car_no { get; set; }
public String color { get; set; }
}
}
}
现在我的 Web 应用程序看起来像这样:
using Elasticsearch.Net;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Configuration;
using Nest;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication5
{
public partial class WebForm1 : System.Web.UI.Page
{
Stopwatch stopwatch = new Stopwatch();
Uri node;
ConnectionSettings settings;
ElasticClient client;
IList<person> list;
protected void Page_Load(object sender, EventArgs e)
{
node = new Uri("http://localhost:9200");
settings = new ConnectionSettings(node, defaultIndex: "people");
client = new ElasticClient(settings);
list = new List<person>();
}
public IList<person> Search(ref long totalResult, int from, int size, string searchKeyword)
{
list.Clear();
stopwatch.Start();
try
{
var result = client.Search<person> /* */
stopwatch.Start();
totalResult = result.Total;
list = result.Hits.Select(t => t.Source).ToList<person>();
}
catch (Exception ex)
{
string msg = ex.Message;
}
return
list;
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
long totalResult = 0;
IList<person> List = new List<person>();
List = Search(ref totalResult, 0, 1000,TextBox1.Text);
Label1.Text = "" + List.Count + " result(s)"+ " in "+ stopwatch.Elapsed.TotalSeconds+"seconds";
GridView1.DataSource = List;
GridView1.DataBind();
List.Clear();
}
}
}
这里searchKeyword是我需要搜索的词。
我在浏览器的搜索框(网络表单)中输入它。
searchKeyword 可能包含任何需要与我的表 person 中的任何字段的值匹配的值。
如果 searchKeyword 与嵌套文档匹配,则应返回确切的嵌套文档。
我不知道我的嵌套查询有问题,或者我实际上不知道如何使用嵌套查询来执行此操作。每次我运行应用程序并搜索表中实际存在的值时,我得到的结果为零。请帮助我弄清楚如何编写 query 以在嵌套字段中搜索并帮助我检查我是否正确编写了 class。
查询部分标记为 /* */。
谁能帮我解决这个问题?
更新 这是我的索引映射:
POST- people/person/_mapping
{
"person":{
"properties":{
"car": {
"type": "nested"
}
}
}
}
我的记录是这样的:
POST-people/person
{
"id":1,
"fname":"aditi",
"mname":"ananya",
"lname":"xyz",
"houseno":"abc",
"car":
[
{
"carname":"fiat",
"carno":1234,
"color":"white"
},
{
"carname":"maruti",
"carno":5678,
"color":"silver"
}
]
}
POST-people/person
{
"id":2,
"fname":"robin",
"mname":"kumar",
"lname":"sharma",
"houseno":"efg",
"car":
[
{
"carname":"audi",
"carno":4321,
"color":"black"
},
{
"carname":"honda",
"carno":8765,
"color":"red"
},
{
"carname":"merecedez",
"carno":0101,
"color":"purple"
}
]
}
这意味着我有 2 条记录。
第二次更新
我试过这个查询,它工作正常。虽然这不是我的最终查询。
POST-people/person/_search
{
"_source":false,
"query": {
"filtered": {
"query": {"match_all": {}},
"filter": {
"nested": {
"path": "car",
"query":{
"filtered": {
"query": { "match_all": {}},
"filter": {
"and": [
{"term": {"car.carname":"mercedez"}},
{"term": {"car.color":"purple"}}
]
}
}
},
"inner_hits":{}
}
}
}
}
}
第三次更新
好的,所以现在在这种情况下,我的最终查询应该是:
{"_source":false,
"query": {
"filtered": {
"query": {"match_all": {}},
"filter": {
"nested": {
"path": "car",
"filter": {
"term": {
"car.carname": "audi"
}
},
"inner_hits" : {}
}
}
}
}
}
如何在 .net 中编写此查询?
在这里,“_source”和“inner_hits”对我来说很重要,因为我只想返回匹配的嵌套文档而不返回其他任何内容(即我只想返回匹配的嵌套文档而不是其他嵌套文档)。
那么,您能帮我写下相应的搜索查询吗?
此外,我在这里匹配car.carname 字段,但我希望我的应用程序应该能够匹配car 字段的所有其他子字段,例如car.carno 和car.color,甚至所有其他子字段id、fname 等顶级字段。
第四次更新
在这里,我在 .net 中为我在 第三次更新 中提到的最终查询编写了搜索查询(请查看我的第三次更新)。
你能检查一下是否正确吗?
我写的.net中相应的最终查询是:
(s => s
.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("audi"))))))));
这是我通过研究您的查询所写的(非常感谢 :))。请检查一下并告诉我是否有任何问题。但是,是的,我仍然无法检索任何结果。
【问题讨论】:
标签: c# .net elasticsearch nested nest