如果这是一个基本问题,我提前道歉 - 我对ElasticSearch非常陌生,并且需要接受很多。
目前,我正在尝试实施一个搜索所有索引列的基本关键字搜索,并使用特定字段Year
获得一些奇怪的结果。我知道应该从结果中找到一定数量的文件,如果我搜索“2014”,他们都会成功回来。如果我只搜索“14”,则根本不会回来,如果我添加一个通配符(例如*14
),那么我会得到一个结果,因为它没有使用{{1在搜索中,而是从Year
字段中提取它。
我100%肯定这是我在查询结构上做错了,所以任何提示?顺便说一句,如果有人可以提供建议的地方来了解更多关于NEST的弹性,那将非常有帮助。他们的文档缺乏一点,你必须了解如何使用Elastic已经大部分时间才有意义,因为我没有,我就磕磕绊绊了。
以下是Description
:
ElasticListing
我与NEST一起使用的搜索结构是这样的,其中 public long Id { get; set; }
public string Brand { get; set; }
public string Manufacturer { get; set; }
public string ActiveTags { get; set; }
public string Description { get; set; }
public int Year { get; set; }
public string Location { get; set; }
将是“2014”(没有引号):
keyword
答案 0 :(得分:4)
您要执行的操作是针对Elasticsearch中term
字段的Year
查询
var response = client.Search<ElasticListing>(s => s
.AllTypes()
.Query(query => query
.Term(f => f.Year, 2014)
)
.Size(pageSize)
.Explain()
);
查看文档的writing queries section。
为了在Year
字段上执行通配符查询,需要将其编入索引为keyword
data type(keyword
不会在索引时分析输入,这可能是什么我们希望将数值索引为&#34;字符串&#34;)。
默认情况下,NEST会将Year
字段序列化为JSON中的数字,Elasticsearch会将此字段的映射推断为数字数据类型。即使使用NEST的automapping,NEST也会推断integer
的{{1}}数据类型映射,以匹配属性的CLR类型Year
。因此,我们需要覆盖此推断映射,以确保将Int32
编入索引为Year
数据类型。
这是一个完整的例子
keyword