【问题标题】:ElasticSearch NEST DSL Query Cross Fields QueryElasticSearch NEST DSL 查询 跨字段查询
【发布时间】:2021-11-15 09:38:36
【问题描述】:

我正在尝试将以下 ElasticSearch DSL 查询转换为 NEST,但似乎有些地方不正确。 这是我的 DSL 查询:

{  
  "query": {
    "multi_match": {
            "query": "AJ",
            "type": "cross_fields",            
            "fields": ["name", "shortname", "shortname2", "number"],
            "operator": "and"            
          }
  }
}

我有一个 POCO 课程。我想得到一个列表的结果,如下所示:

public class SearchDto
    {
        public Guid Id { get; set; }
        public string Number { get; set; }
        public string Name { get; set; }
        public string ShortName2 { get; set; }
        public string ShortName1 { get; set; }
    }

由于是跨字段查询,我创建了这样的字段:

Fields nameField = Infer.Field<SearchDto>(p => p.Name);
var shortName2 = Infer.Field<SearchDto>(p => p.ShortName2);
var shortName1 = Infer.Field<SearchDto>(p => p.ShortName1);
var number = Infer.Field<SearchDto>(p => p.Number);

这是我的 NEST 查询:

var searchRequest = new SearchRequest() {
   Query = new MultiMatchQuery() {
     Fields = nameField
       .And(shortName2)
       .And(shortName1)
       .And(number),
       Query = value,
       Operator = Operator.And,
       Type = TextQueryType.CrossFields
   }
 }

当我为我的 searchRequest 获取 Json 字符串时,它只使用以下内容打印“{}”:

var json = _client.RequestResponseSerializer.SerializeToString(searchRequest);

它还将“{}”作为请求正文发布

我还尝试了以下方法:

var response = _client.Search <List<SearchDto>> (s => s
  .Size(500)
  .Index("mysearchIndex")
  .Query(q => q
    .MultiMatch(m => m
      .Type(TextQueryType.CrossFields)
      .Fields(nameField)
      .Fields(shortName1)
      .Fields(shortName2)
      .Fields(number)
      .Operator(Operator.And)
      .Query(value)
    )
  ));

以上查询仅向我的 elasticsearch 端点发布“{“size”:500}”

有人可以建议我做错了什么和/或建议使用 NEST 处理我的查询的更好方法吗?由于某种原因,它甚至没有构建完整的查询。

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    嵌套查询是无条件的。如果输入被确定为 null 或空字符串,则查询将从请求中省略。

    在您的查询中 "value" 为空或 null ,则生成的查询将为 "{}"。

    如果您的意图是搜索空值。然后您需要将单个查询标记为逐字逐句

    单个查询可以逐字标记以生效;逐字查询将被序列化并在请求中发送到 Elasticsearch,绕过 NEST 的无条件检查。

    例子

    var searchRequest = new SearchRequest()
                    {
                        Query = new MultiMatchQuery()
                        {
                            Fields = nameField
                           .And(shortName2)
                           .And(shortName1)
                           .And(number),
                            Query = "",
                            Operator = Operator.And,
                            Type = TextQueryType.CrossFields,
                            IsVerbatim=true   ---> note flag
                        }
                    };
    

    对应查询

    {"query":{"multi_match":{"fields":["name","shortName2","shortName1","number"],"operator":"and","query":"","type":"cross_fields"}}}
    

    【讨论】:

    • Jaspreet,感谢您的建议。事实上,我的 api 控制器的值为 NULL。我从来没有想过这可能是我的控制器操作有问题,我从来没有检查过这个值。它确实解决了我的问题。再次感谢。
    • @AndyJohnson,很高兴能帮上忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多