【问题标题】:How do I use Elasticsearch NEST to return results using match search?如何使用 Elasticsearch NEST 通过匹配搜索返回结果?
【发布时间】:2016-11-08 12:58:13
【问题描述】:

我正在尝试使用 C# 和 NEST 编写一个简单的控制台应用程序,以了解有关 Elasticsearch 的更多信息。

我可以在 Sense (Kibana) 中运行以下查询

GET /companies/company/_search
{
    "query": {
          "match": {
              "dbaName": "STEAK"
         }
     }
}

我会得到以下结果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "companies",
        "_type": "company",
        "_id": "1",
        "_score": 0.15342641,
        "_source": {
          "dbaName": "We do steak",
          "primaryLicenseStatus": "T",
          "primaryLicenseDescription": "Restuarant",
          "lastActivityDate": "2016-06-06T08:25:23.4136549-04:00"
        }
      }
    ]
  }
}

但是,当我尝试使用 NEST 执行此查询时,我没有得到任何结果:

var response = client.Search<Company>(s => s
    .Index(theIndex)
    .Query(q =>
        q.Match(m => m.Field(f => f.DbaName).Query("steak"))
    )
);

更新 - 我想通了!
所以我觉得我应该把这篇文章写下来,因为这个问题与解决方案无关。

剧透:我在 NEST 中的查询很好。

我创建了一个控制台应用程序,它首先删除索引,重新创建它,插入公司,然后搜索它。
服务器没有跟上我的控制台应用程序,只有当我停止删除/重新创建索引时,我才能让搜索工作。 (捂脸)
如果有人觉得我应该直接删除这个帖子,请在下面的 cmets 中告诉我,我会删除它,但有人可能会觉得它有帮助。

【问题讨论】:

  • NEST 查询的序列化形式是什么样的? dbaName 字段上设置了什么分析器(如果有)?
  • 感谢拉斯的回复。抱歉,我对 Elasticsearch 有点陌生,并且不能 100% 确定如何获得您的问题的答案。我没有指定分析器,所以我假设正在使用默认值。我已经探索了如何找出答案,但没有拿出一篇可靠的文章来解释。
  • 不用担心 :) 您可以使用 Fiddler(targeting ipv4.fiddler:9200` 而不是 localhost:9200)来记录请求/响应,或者您可以按照 - @ 使用 OnRequestCompleted 987654321@。被索引的文档不会立即在搜索中可用,您需要等待刷新间隔(默认为 1 秒)才能出现在搜索文档中。您可以手动刷新,这对测试很有用,但应尽量避免在生产中频繁调用它。

标签: c# elasticsearch nest elasticsearch-net


【解决方案1】:

调试过程的第一步应该是查看向 ES 发出的请求,并将其与您的预期进行比较。

这是一个很好的扩展方法来获取发送到 ES 的原始 json:

    /// <summary>
    /// Debugging method to get the json that was sent to ES
    /// </summary>
    public static string GetRequestString(this IResponse response)
    {
        var request = response.RequestInformation.Request;
        if (request != null)
        {
            return Encoding.Default.GetString(request);
        }
        return response.RequestInformation.RequestUrl;
    }

【讨论】:

  • 感谢您的回复。两件事:第一:response.RequestInformation 正在引发错误。如果这很重要,我正在使用 NEST 2.3.3。第二:我的 var request = response.ApiCall.RequestBodyInBytes; 返回 null。想法?
  • 好的,我必须更改设置才能恢复请求正文。正文是这样的:{"query":{"match":{"dbaName":{"query":"steak"}}}} 当我在 Sense 中运行时,它可以工作。想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2018-11-07
  • 2013-03-31
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多