-1

我正在尝试使用 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"[NB~ 索引中的实际值],我将无法找到结果。

但是,如果我以“goldpgl”之类的小写形式传递值,它就可以工作。

此外,它不适用于“Gold - PGL”或“某些其他贷款”等值。

我的 POCO 如下

public class ProductModel
    {
        public string product { get; set; }
        public string agencyid { get; set; }

    }

有什么问题以及如何纠正这个问题?

4

1 回答 1

1

由于您没有提供映射和搜索查询,我假设它正在发生,因为您使用的是术语查询而不是匹配查询

不分析术语查询意味着您在搜索查询中输入的任何内容都将与索引中的标记匹配。默认情况下,Elasticsearch 中的所有文本字段都使用将标记转换为小写的标准分析器。因此在您的术语查询中GoldPGL匹配时不匹配。goldpgl

虽然match查询如解释的官方文档是分析查询,并且相同的分析器应用于搜索词,该分析器在索引时应用,因此GoldPGL以及goldpgl转换为goldpgl并且查询与文档匹配,并且与Gold - PGL它匹配并验证相同由我。

分析 API非常方便地解决这些类型的问题,其中搜索查询与索引标记不匹配,GOLDPGL下面显示了如何分析的一个示例:

发布 /_analyze

{
    "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 展示了您的示例。

索引定义

邮政 /

{
    "mappings": {
        "properties": {
            "product": {
                "type": "text"
            }
        }
    }
}

索引一些文档


发布 //_doc/1

{
    "product": "GoldPGL"
}

索引第二个文档

{
    "product": "Gold - PGL"
}

现在使用术语查询搜索查询(如您的示例所示),不返回任何结果(使用时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"
            }
        }
    }
}

这个返回结果

"hits": [
            {
                "_index": "so-term-nest",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.8025915,
                "_source": {
                    "product": "GoldPGL"
                }
            }
        ]
于 2020-03-10T12:00:52.347 回答