0

原谅我的新手,因为我是 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; }
}

感谢帮助!

4

1 回答 1

2

您的问题是您正在使用术语查询,这些查询未进行分析,因此区分大小写。

尝试使用匹配查询(已分析):

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))
     )
);

更进一步——因为您在两个不同的字段上查询相同的文本,您可以使用多重匹配查询而不是组合两个术语查询:

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)
        )
     )
);

为了更好地理解分析,The Definitive Guide中的映射和分析部分非常适合阅读。

于 2014-08-28T03:43:16.157 回答