无法根据文档属性值搜索elasticsearch

时间:2016-04-20 10:51:20

标签: c# elasticsearch nest

我在elasticsearch中保存了许多产品类型文档,但无法按文档属性值搜索并需要帮助。

//Product Class
public Guid productID { get; set; }
public string productName { get; set; }
public Guid productTypeID { get; set; }
public List<Guid> categoryIds {get; set; }

我正试图像这样搜索:

//Search function
var esconn = Yaziylabir.Bukalemun.DataObjects.ElasticSearchConnectionManager.GetClient();
QueryContainer q = null;
if (!ProductType.HasValue || (ProductType.HasValue && ProductType.Value == B2CVariables.PRODUCTTYPE_PRODUCT))
{
    q = Query<ProductModel>.Term(t => t.ProductTypeID, B2CVariables.PRODUCTTYPE_PRODUCT);
}
if (Category != null)
{
    //catListZ is also List<Guid>
    q &= Query<ProductModel>.Terms(u=>u.Field(z=>z.CategoryIDs).Terms<Guid>(catListZ));
}
// as a bonus I also have keyword search
if (!string.IsNullOrEmpty(Keyword))
{
    q &= Query<ProductModel>.QueryString(t => t.Query(Keyword));
}

//do search
var pp = new SearchRequest(Yaziylabir.Bukalemun.DataObjects.ElasticSearchConnectionManager.DefaultIndex, "product");
pp.Query = q;
pp.Size = PageSize;
var res = esconn.Search<ProductModel>(pp);
rtnVal = res.Documents.ToList();

现在,我尝试了这些的组合(只有producttypeID,只有categoryID,只有关键字等等),并观察fiddler正在发生的事情。

没有结果回来,没有错误提出。只有0次点击。请求正文似乎也可以。

当我检查存储在该索引中的文档时,它们就在那里并且它们具有所需的值并且应该返回结果。

这里有什么问题?你有什么想法?请帮帮我。我很惭愧成为无法正确搜索数据库的人。

修改: 搜索正文:

{"size":12,"query":{"term":{"productTypeID":{"value":"cae344cf-8cfa-4960-8387-8ee89899c53f"}}}}

示例文档:

{
  "productID": "5687b8ac-c3fe-4f1a-9643-08b0bf6cede8",
  "productName": "7011 Yelek",
  "productCode": "701102Y001  ",
  "currency": {
    "currencyID": 1,
    "sign": "TL",
    "rate": 0
  },
  "normalPrice": 170,
  "currentPrice": 84.9,
  "isDiscounted": true,
  "taxRate": 8,
  "productTypeID": "cae344cf-8cfa-4960-8387-8ee89899c53f",
  "defaultImagePath": "/contents/images/productimages/75681ee4-19b3-4c7d-a24b-b3566085a980.jpg",
  "totalStockCount": 8,
  "totalStockRecordCount": 4,
  "isInStock": true,
  "statusID": "9ad17471-2ff2-4eb0-9cb0-4b86922263ea",
  "categoryIDs": [
    "a8c83f54-b784-4866-89c3-cabc641490d5",
    "9d5a9ab7-8edb-4d5a-800b-c48bf6575d78"
  ]
}

我没有包含所有属性,因为它会使文档很长 以下是映射:

{
  "mappings": {
    "product": {
      "properties": {
        "categoryIDs": {
          "type": "string"
        },
        "currentPrice": {
          "type": "double"
        },
        "isDiscounted": {
          "type": "boolean"
        },
        "isInStock": {
          "type": "boolean"
        },
        "normalPrice": {
          "type": "double"
        },
        "productCode": {
          "type": "string"
        },
        "productID": {
          "type": "string"
        },
        "productName": {
          "type": "string"
        },
        "productTypeID": {
          "type": "string"
        },
        "statusID": {
          "type": "string"
        },
        "taxRate": {
          "type": "double"
        },
        "totalStockCount": {
          "type": "long"
        },
        "totalStockRecordCount": {
          "type": "long"
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我怀疑productTypeID字段正在使用默认分析器 - standard - 或任何其他分析器将其拆分到错误的位置。您需要的是productTypeIDindex: not_analyzed或使用keyword之类的内容进行分析。而且您需要手动创建映射,否则您无法按照自己的方式进行映射。

我们的想法是,ES会默认将productTypeID值标记为-,并将其分割为term,因此在索引中您的标记不是整个值。相反,您需要保持该值不变,以便fields完全匹配它。

例如,为了不弄乱您之前的映射,您可以添加not_analyzed来定义将 "productTypeID": { "type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } } 的子字段:

{"size":12,"query":{"term":{"productTypeID.raw":{"value":"cae344cf-8cfa-4960-8387-8ee89899c53f"}}}}

您的查询需要略有改动:curl -XPUT "http://localhost:9200/your_index" -d' { "mappings": { "product": { "properties": { "categoryIDs": { "type": "string" }, "currentPrice": { "type": "double" }, "isDiscounted": { "type": "boolean" }, "isInStock": { "type": "boolean" }, "normalPrice": { "type": "double" }, "productCode": { "type": "string" }, "productID": { "type": "string" }, "productName": { "type": "string" }, "productTypeID": { "type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } }, "statusID": { "type": "string" }, "taxRate": { "type": "double" }, "totalStockCount": { "type": "long" }, "totalStockRecordCount": { "type": "long" } } } } }'

为了完整起见,这是手动创建映射的完整命令。您可以在索引仍处于活动状态时执行此操作,但您仍需要重新索引文档:

Rails.application.routes.draw do
    use_doorkeeper
end