【问题标题】:Elasticsearch could not search on string fieldElasticsearch 无法搜索字符串字段
【发布时间】:2020-11-16 07:08:51
【问题描述】:

我正在尝试使用 NEST 根据用户的输入动态创建搜索查询。 我想在带有 Term 的过滤器中添加多个过滤器,但无法搜索字符串字段,我找不到任何解决方案。

例如代码是,此代码尝试搜索字符串字段但它不起作用

var response = await _elasticClient.SearchAsync<CustomerAddressInfo>(p => p
            .Query(q => q
                .Bool(b => b
                    .Filter(f => f.Term(t => t.Field(p => p.AccountAddressId).Value(type.AccountAddressId)))
                )
            )
        );

另一个简单的搜索是整数字段,它正在成功

var response = await _elasticClient.SearchAsync<CustomerAddressInfo>(p => p
            .Query(q => q
                .Bool(b => b
                    .Filter(f => f.Term(t => t.Field(p => p.CreateUnitId).Value(type.CreateUnitId)))
                )
            )
        );

但是;如果我使用 Match 关键字在字符串字段上搜索数据,则再次搜索成功

var response = await _elasticClient.SearchAsync<CustomerAddressInfo>(p => p
            .Query(q => q
                .Match(m => m
                    .Field(f => f.AccountAddressId)
                    .Query(type.AccountAddressId)
                )
            )
        );

问题是,如何使用 Match 查询方法给出多个搜索条件,或者如何通过弹性上的 Term 查询方法搜索字符串字段

【问题讨论】:

    标签: c# elasticsearch .net-core nest elasticsearch.net


    【解决方案1】:

    我不熟悉 NEST,但是要使用匹配查询或术语查询搜索多个字段,您可以参考以下示例:

    布尔查询用于组合一个或多个子句,了解更多参考this

    避免在文本字段中使用term query

    默认情况下,Elasticsearch 会更改文本字段的值作为 分析。这可以找到文本字段值的完全匹配 困难。

    要搜索文本字段值,请改用匹配查询。

    索引映射

    {
      "mappings": {
        "properties": {
          "name": {
            "type": "text"
          },
          "cost": {
            "type": "long"
          }
        }
      }
    }
    

    索引数据:

    {
        "name":"apple",
        "cost":"40"
    }
    {
        "name":"apple",
        "cost":"55"
    }
    

    搜索查询:多个搜索条件匹配

       {
      "query": {
        "bool": {
          "must": [
            { "match": { "name": "apple" }},
            { "match": { "cost": 40 }}
          ]
        }
      }
    }
    

    按字词查询进行现场搜索

      {
      "query": {
        "bool" : {
          "must" :[
             {"term" : { "name" : "apple" }},
             {"term":  { "cost":40 }}
          ]
        }
      }
    }
    

    搜索结果:

    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.1823215,
        "_source": {
          "name": "apple",
          "cost": "40"
        }
      }
    ]
    

    【讨论】:

    • 感谢您的回答,但我需要在 .netcore 上使用 NEST 进行搜索的解决方案
    【解决方案2】:

    嘿,我没有得到你的全部要求。但是如果你想在过滤器上添加多个条件,那么你可以像下面这样。

    QueryContainer qSs = null;
    foreach(var query in queries) // let say queries is list of yours search item
    {
      qSs &= new TermQuery { Field = "your_field_name", Value = query  };
    }
    
     var searchResults = await _elasticClient.SearchAsync<CustomerAddressInfo>(s => s
                    .Query(q => q
                         .Bool(b => b.Filter(qSs)  )
                         )
                    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2021-03-10
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多