NEST C#Elasticsearch查询property是一个列表

时间:2014-08-27 12:12:44

标签: c# elasticsearch nest

我正在尝试使用NEST(.NET elasticsearch wrapper)查询以下实体:

public class TourIndex
{

    public Guid ProductId { get; set; }

    public Guid[] Periodes { get; set; }

    public Guid[] Countries { get; set; }

    ...
}

我想得到所有TourIndex对象,其中一个国家是guid x。

我的索引是正确的,我可以在浏览http://localhost:9200/my-index/_search?pretty=true&q=*:*时看到我的TourIndex对象

我的查询尝试是:

System.Func<QueryDescriptor<TourIndex>, QueryContainer> elasticSearchQuery = (q => q.Term(x => x.Countries.First(), myGuidX));

var client = ElasticSearchHelper.CreateNestClient();
var searchResponse = client.Search<TourIndex>(s => s.Query(elasticSearchQuery));

return searchResponse.Documents;

不幸的是我没有结果。响应有效但不返回任何文档。我已经进行了双重检查,我的索引中有一个有效的TourIndex,它有我的国家guid。

索引对象的示例:

{
      "_index" : "my-index",
      "_type" : "tour",
      "_id" : "WRAG141004",
      "_score" : 1.0,
      "_source":{
  "erpTourId": "SNG141004",
  "productId": "9d28694e-d705-e411-93f9-00155d01210a",
  "countries": [
    "01cad5a4-caf4-4d01-88e7-936c0827b13e"
  ],
  "productType": "88e436ff-d605-e411-93f9-00155d01210a",
  "subProductType": "ece1fa1b-d705-e411-93f9-00155d01210a",
  "dayCount": 8,
  "price": 7852,
  "groupCount": 0,
  "isPromotion": true,
  "composition": []
}

所以myGuidX可以是"01cad5a4-caf4-4d01-88e7-936c0827b13e"例如。

分析器/贴图:

{
    "live-to-travel-index": {
        "mappings": {
            "tour": {
                "properties": {
                    "available": {
                        "type": "long"
                    },
                    "booked": {
                        "type": "long"
                    },
                    "capacity": {
                        "type": "long"
                    },
                    "composition": {
                        "type": "string"
                    },
                    "countries": {
                        "type": "string"
                    },
                    "dayCount": {
                        "type": "long"
                    },
                    "globusTourId": {
                        "type": "string"
                    },
                    "groupCount": {
                        "type": "long"
                    },
                    "isPromotion": {
                        "type": "boolean"
                    },
                    "options": {
                        "type": "long"
                    },
                    "periodes": {
                        "type": "string"
                    },
                    "price": {
                        "type": "long"
                    },
                    "productId": {
                        "type": "string"
                    },
                    "productType": {
                        "type": "string"
                    },
                    "queue": {
                        "type": "long"
                    },
                    "subProductType": {
                        "type": "string"
                    }
                }
            }
        }
    }
}

我没有在c#中配置任何内容,我认为这是默认的。

更新

我找到了问题的解决方案,但我认为这是一种不好的做法。

此代码为我提供了结果:

elasticSearchQuery = (q => q.Match(m => { m.Query("*" +    query.CountryId.Value.ToString() + "*"); }));
var client = ElasticSearchHelper.CreateNestClient();
var searchResponse = client.Search<TourIndex>(s => s.Query(elasticSearchQuery));

我的猜测是通配符会降低性能。

1 个答案:

答案 0 :(得分:0)

您能提供有关guid格式,字段映射和分析器的一些详细信息吗?可能没有像您期望的那样搜索/分析这些值。另外,你安装了Kibana / Kopf吗?