如何模仿URI查询

时间:2015-11-24 22:24:26

标签: c# elasticsearch nest

对于SO而言,这可能是一个基本问题,但我想我还是会问。

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

我有这个领域" StoryText"它被映射为 类型"字符串" 索引为" 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"
            }
        }
    }
}

}

我得到了多个文件返回的多个文件(即"男孩大声地坐着#34;,"男孩静静地站着#34;等等。)

有人可以帮我理解我是如何重构我的搜索请求来模仿我使用基本查询参数获得的结果的吗?

目前我在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"
                }
            }
        }
    }
}

米克

1 个答案:

答案 0 :(得分:1)

好吧,首先你要在这里执行两个不同的查询。第一个是在查询上下文中运行,而第二个本质上是在过滤上下文中执行的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)
            )
        )
    );

说完所有这些并查看过滤后的查询,它应该根据我的测试做你期望的事情。你的领域绝对没有被分析过吗?你可以张贴你的地图吗?