Elasticsearch无法搜索字符串字段

时间:2020-07-27 00:10:48

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

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

例如,该代码尝试在不起作用的字符串字段上搜索

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查询方法给出多个搜索条件,或者如何通过Elastic上的Term查询方法查找字符串字段

2 个答案:

答案 0 :(得分:0)

我不熟悉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"
    }
  }
]

答案 1 :(得分: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)  )
                     )
                );