原谅我的新生儿,因为我是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; }
}
感谢帮助!
答案 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 analysis的The Definitive Guide部分非常精彩。