NEST 不返回精确搜索的值
NEST is not returning values for an exact search
我正在尝试使用如下所示的 NEST 构建动态查询
string product = "goldpgl";
string agencyid = "1123";
ISearchResponse <ProductModel> res = client().Search<ProductModel>(s => s
.Index("proddata")
.From(0)
.Size(100)
.Query(q =>
+q.Term(p => p.product, product) &&
+q.Term(p => p.agencyid, agencyid)));
如果我通过,product value = "GoldPGL"
[N.B.~ 索引中的实际值],我无法找到结果。
但是,如果我像 "goldpgl" 一样以小写形式传递值,它会起作用。
此外,它不适用于 "Gold - PGL" 或 "SOME OTHER LOAN" 等值。
我的POCO如下
public class ProductModel
{
public string product { get; set; }
public string agencyid { get; set; }
}
哪里出了问题,如何纠正?
由于您没有提供映射和搜索查询,我假设它的发生是因为您使用的是 term query not the match query。
不分析术语查询意味着您在搜索查询中输入的任何内容都将与索引中的标记匹配。默认情况下,Elasticsearch 中的所有文本字段都使用 standard analyzer 将标记转换为小写。因此 GoldPGL
不匹配,而 goldpgl
在您的字词查询中匹配。
虽然 match
查询如官方文档所解释的那样是分析查询,并且对搜索词应用相同的分析器,该分析器在索引时应用,因此 GoldPGL
以及 goldpgl
转换为 goldpgl
并且两个查询都与文档匹配并且与 Gold - PGL
相同,这也由我匹配和验证。
Analyze API 非常方便地解决这些类型的问题,其中搜索查询与索引标记不匹配,下面显示了如何分析 GOLDPGL
的一个示例:
POST/_分析
{
"text": "GOLDPGL",
"analyzer" : "standard"
}
{ "token": "goldpgl",}
{
"text": "GOLD - PGL",
"analyzer" : "standard"
}
{
"token": "gold",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "pgl",
"start_offset": 7,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
我重现了您的问题,但由于我不熟悉 NEST,因此使用 REST 展示了您的示例 API。
索引定义
POST /
{
"mappings": {
"properties": {
"product": {
"type": "text"
}
}
}
}
索引一些文件
POST //_doc/1
{
"product": "GoldPGL"
}
索引 2nd 文档
{
"product": "Gold - PGL"
}
现在使用术语查询搜索查询(如您的示例所示),return 没有任何结果(当使用 GoldPGL
时)
{
"query": {
"term": {
"product": {
"value": "GoldPGL"
}
}
}
}
当使用goldgpl
时,它给出结果
{
"query": {
"term": {
"product": {
"value": "goldpgl"
}
}
}
}
结果
"hits": [
{
"_index": "so-term-nest",
"_type": "_doc",
"_id": "1",
"_score": 0.8025915,
"_source": {
"product": "GoldPGL"
}
}
]
解决方案(使用匹配查询)
{
"query": {
"match" : {
"product" : {
"query" : "GoldPGL"
}
}
}
}
和这个 return 结果
"hits": [
{
"_index": "so-term-nest",
"_type": "_doc",
"_id": "1",
"_score": 0.8025915,
"_source": {
"product": "GoldPGL"
}
}
]
我正在尝试使用如下所示的 NEST 构建动态查询
string product = "goldpgl";
string agencyid = "1123";
ISearchResponse <ProductModel> res = client().Search<ProductModel>(s => s
.Index("proddata")
.From(0)
.Size(100)
.Query(q =>
+q.Term(p => p.product, product) &&
+q.Term(p => p.agencyid, agencyid)));
如果我通过,product value = "GoldPGL"
[N.B.~ 索引中的实际值],我无法找到结果。
但是,如果我像 "goldpgl" 一样以小写形式传递值,它会起作用。
此外,它不适用于 "Gold - PGL" 或 "SOME OTHER LOAN" 等值。
我的POCO如下
public class ProductModel
{
public string product { get; set; }
public string agencyid { get; set; }
}
哪里出了问题,如何纠正?
由于您没有提供映射和搜索查询,我假设它的发生是因为您使用的是 term query not the match query。
不分析术语查询意味着您在搜索查询中输入的任何内容都将与索引中的标记匹配。默认情况下,Elasticsearch 中的所有文本字段都使用 standard analyzer 将标记转换为小写。因此 GoldPGL
不匹配,而 goldpgl
在您的字词查询中匹配。
虽然 match
查询如官方文档所解释的那样是分析查询,并且对搜索词应用相同的分析器,该分析器在索引时应用,因此 GoldPGL
以及 goldpgl
转换为 goldpgl
并且两个查询都与文档匹配并且与 Gold - PGL
相同,这也由我匹配和验证。
Analyze API 非常方便地解决这些类型的问题,其中搜索查询与索引标记不匹配,下面显示了如何分析 GOLDPGL
的一个示例:
POST/_分析
{
"text": "GOLDPGL",
"analyzer" : "standard"
}
{ "token": "goldpgl",}
{
"text": "GOLD - PGL",
"analyzer" : "standard"
}
{
"token": "gold",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "pgl",
"start_offset": 7,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
我重现了您的问题,但由于我不熟悉 NEST,因此使用 REST 展示了您的示例 API。
索引定义
POST /
{
"mappings": {
"properties": {
"product": {
"type": "text"
}
}
}
}
索引一些文件
POST //_doc/1
{
"product": "GoldPGL"
}
索引 2nd 文档
{
"product": "Gold - PGL"
}
现在使用术语查询搜索查询(如您的示例所示),return 没有任何结果(当使用 GoldPGL
时)
{
"query": {
"term": {
"product": {
"value": "GoldPGL"
}
}
}
}
当使用goldgpl
时,它给出结果
{
"query": {
"term": {
"product": {
"value": "goldpgl"
}
}
}
}
结果
"hits": [
{
"_index": "so-term-nest",
"_type": "_doc",
"_id": "1",
"_score": 0.8025915,
"_source": {
"product": "GoldPGL"
}
}
]
解决方案(使用匹配查询)
{
"query": {
"match" : {
"product" : {
"query" : "GoldPGL"
}
}
}
}
和这个 return 结果
"hits": [
{
"_index": "so-term-nest",
"_type": "_doc",
"_id": "1",
"_score": 0.8025915,
"_source": {
"product": "GoldPGL"
}
}
]