我正在使用ElasticSearch。 当我这样做时:
{query: "blackberry -q10"}
我得到了我想要的(所有结果都参考了BlackBerry而不是Q10)。
但是,我想将搜索到的字段限制为“标题”字段。例如,_source文档有标题,正文,标签等,我只想搜索标题。 ElasticSearch“匹配”似乎对我来说......
{query: {match: {title: "blackberry -q10"}}}
虽然仅成功搜索标题,但仍会返回标题中包含Q10的结果,与上面的搜索不同。
我正在看the match documentation,但似乎无法弄明白。
谢谢!
答案 0 :(得分:1)
匹配查询不使用这样的否定语法。例如,你不能使用“减号”来否定一个词。它将被默认搜索分析器解析为连字符。
在这种情况下,我会使用过滤查询。您可以在查询中添加否定...但过滤器会更快。
{
"filtered":{
"query":{
"match":{
"title":"blackberry"
}
},
"filter":{
"bool":{
"must_not":{
"term":{
"title":"q10"
}
}
}
}
}
}
注意,您可能需要更改term
过滤器,具体取决于您在索引时分析字段的方式。
编辑:
根据您在下面的评论,如果您真的想要保持“内联”否定的能力,您可以使用field
查询(query_string
的更具体版本,这也可以)。此查询使用Lucene语法,允许内联否定
{
"field" : {
"title" : "blackberry -q10"
}
}
不建议使用query_string
及其衍生物的原因是因为很容易在脚下射击。或者更确切地说,用户可以轻松地拍摄服务器。 Query_string需要正确的语法,如果用户输入错误,将会死亡。它还允许您的用户通常通过通配符进行一些可怕的低效查询
答案 1 :(得分:0)
你想匹配所有拥有“黑莓”并且没有q10的游戏,而不是所有拥有“黑莓”或没有q10的游戏。
匹配的默认布尔运算符(在大多数情况下)是OR。尝试在查询中添加“operator”:“and”子句。