c# - 如何模仿URI查询

标签 c# elasticsearch nest

对于 SO 来说,这可能是一个太基础的问题,但我想我还是会问。

我尝试使用 ElasticSearch,并尝试返回与我感兴趣的领域完全匹配的单个文档。

我有字段“StoryText”,它被映射为type "string" 并且索引为“not_analyzed”。

当我使用基本 URI 查询进行搜索时:

123.456.0.789:9200/stories/storyphrases/_search?q=StoryText:"The boy sat quietly"

我按预期返回了一个完全匹配的文档。

但是,当我使用搜索功能时:

GET 123.456.0.789:9200/stories/storyphrases/_search

{
"query" : {
    "filtered" : {
        "filter" : {
            "term" : {
                "StoryText" : "The boy sat quietly"
            }
        }
    }
}

我收到多个返回的文档,其中有很多点击(例如“男孩大声坐着”、“男孩静静地站着”等)

有人可以帮助我了解我需要如何重组我的搜索请求以模仿我使用基本查询参数获得的结果吗?

目前我在 C# 中使用 NEST 生成我的搜索请求,如下所示

var searchresults = client.Search<stories>(p => p
    .Query(q => q
        .Filtered(r => r
            .Filter(s => s.Term("StoryText", inputtext))
            )
        )
    );

非常感谢您的阅读和/或想法!


更新:下面列出了映射

GET /stories/storyphrases/_mappings

{
"stories": {
    "mappings": {
        "storyphrases": {
            "dynamic": "strict",
            "properties": {
                "@timestamp": {
                    "type": "date",
                    "format": "date_optional_time"
                },
                "@version": {
                    "type": "string"
                },
                "SubjectCode": {
                    "type": "string"
                },
                "VerbCode": {
                    "type": "string"
                },
                "LocationCode": {
                    "type": "string"
                },
                "BookCode": {
                    "type": "string"
                },
                "Route": {
                    "type": "string"
                },
                "StoryText": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "SourceType": {
                    "type": "string"
                },
                "host": {
                    "type": "string"
                },
                "message": {
                    "type": "string"
                },
                "path": {
                    "type": "string"
                }
            }
        }
    }
}

米克

最佳答案

好吧,首先您要在这里执行两个不同的查询。第一个在查询上下文中运行,而第二个本质上是一个在过滤上下文中执行的 match_all 查询。如果您的目标只是模拟第一个查询,但通过传递 JSON 正文,您将需要类似的东西

GET 123.456.0.789:9200/stories/storyphrases/_search
{
    "query" : {
        "query_string" : {
            "query" : "StoryText:'The boy sat quietly'"
        }
    }
}

要使用 Nest 编写这个简单的查询,您可以使用

var searchresults = client.Search<stories>(p => p.QueryString("StoryText:" + inputtext));

或更长的形式

var searchresults = client.Search<stories>(p => p
    .Query(q => q
        .QueryString(qs => qs
            .Query("StoryText:" + inputtext)
            )
        )
    );

它们都生成相同的 JSON 正文并将其发送到 _search 端点。假设 storyphrases 是您的 Elasticsearch 类型,那么您可能还希望将其包含在您的 C# 中。

var searchresults = client.Search<stories>(p => p
    .Index("stories")
    .Type("storyphrases")
    .Query(q => q
        .QueryString(qs => qs
            .Query("StoryText:" + inputtext)
            )
        )
    );

说了这么多,看看你过滤后的查询,根据我的测试,它应该能达到你的预期。你的领域肯定不分析?你能发布你的映射吗?

关于c# - 如何模仿URI查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905023/

相关文章:

java - elasticsearch:找不到索引数据(单元节点已关闭)

c# - 如何使用 ElasticSearch 只返回属性的子集

c# - ElasticSearch C#NEST-如何防止覆盖文档

.net - 使用NEST进行Elasticsearch-搜索时如何忽略标点符号

c# - 使用套接字从服务器向客户端发送值

c# - 在 LINQ 中更新对象

c# - 返回每个 XML 文本元素的 XPath

elasticsearch - 如何删除从词尾删除y的自定义词干?

asp.net - Elasticsearch .net客户端嵌套查询容器始终为null

c# - MONO 4.6.2 服务器 CPU 使用率高