如何模仿URI查询

How to mimic URI query

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

我开始接触 ElasticSearch,我正在尝试 return 一个与我感兴趣的领域完全匹配的文档。

我有字段 "StoryText" 映射为 type "string"索引为 "not_analyzed".

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

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

我 return 一个完全匹配的文档,正如我预期的那样,一次点击。

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

GET 123.456.0.789:9200/stories/storyphrases/_search

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

}

我得到了多个文档 returned,点击率很高(即 "The boy sat loudly"、"The boy stood 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 查询。如果您的 objective 只是模拟第一个查询,但通过传递 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)
            )
        )
    );

说了这么多,看看你过滤后的查询,根据我的测试,它应该符合你的预期。你的领域肯定不分析?你能post你的地图吗?