ElasticSearch与NEST查询问题

时间:2014-08-27 20:32:09

标签: asp.net elasticsearch entity-framework-6 nest elasticsearch-plugin

原谅我的新生儿,因为我是ElasticSearch和NEST的新手。我正在研究一个原型来评估正在实现的.NET解决方案中的ElasticSearch。原型编译并确实似乎搜索,但没有正确返回结果。它只返回几个关键字的结果,仅返回小写,而忽略其他关键字并且不返回任何内容。我在想我的查询有问题。这是查询部分(假设连接信息和指定并构建的默认索引)。

// string searchString to be searched against ProductName and Description fields.            
var searchResults = client.Search<Product>(s=>s
            .From(0)
            .Size(100)
            .Query(q=>q.Term(p=>p.ProductName, searchString) || 
                q.Term(p=>p.Description, searchString)
            ));

如果需要,这是模型:

[ElasticType(IdProperty = "ProductID")]
public class Product
{
    [ScaffoldColumn(false)]
    [JsonIgnore]
    public int ProductID { get; set; }

    [Required, StringLength(100), Display(Name = "Name")]
    public string ProductName { get; set; }

    [Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)]
    public string Description { get; set; }

    public string ImagePath { get; set; }

    [Display(Name = "Price")]
    public double? UnitPrice { get; set; }

    public int? CategoryID { get; set; }
    [JsonIgnore]
    public virtual Category Category { get; set; }
}

感谢帮助!

1 个答案:

答案 0 :(得分:2)

您的问题在于您使用的是term queries,但未对其进行分析,因此区分大小写。

尝试使用match query(已分析):

var searchResults = client.Search<Product>(s => s
    .From(0)
    .Size(100)
    .Query(q => 
        q.Match(m => m.OnField(p => p.ProductName).Query(searchString)) || 
        q.Match(m => m.OnField(p => p.Description).Query(searchString))
     )
);

更进一步 - 因为您在两个不同的字段中查询相同的文本,您可以使用multi match query而不是组合两个术语查询:

var searchResults = client.Search<Product>(s => s
    .From(0)
    .Size(100)
    .Query(q => q
        .MultiMatch(m => m
            .OnFields(p => p.Product, p => p.Description)
            .Query(searchText)
        )
     )
);

为了更好地理解分析,来自mapping and analysisThe Definitive Guide部分非常精彩。