1

我正在尝试使用 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 查询方法搜索字符串字段

4

2 回答 2

0

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

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

避免对文本字段使用术语查询

默认情况下,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"
    }
  }
]
于 2020-07-27T01:08:21.323 回答
0

嘿,我没有得到你的全部要求。但是,如果您想在过滤器上添加多个条件,那么您可以执行以下操作。

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)  )
                     )
                );
于 2020-07-27T04:19:22.480 回答