ElasticSearch与FullText匹配“匹配”

时间:2013-01-31 15:28:36

标签: elasticsearch

我正在使用ElasticSearch。 当我这样做时:

{query: "blackberry -q10"}

我得到了我想要的(所有结果都参考了BlackBerry而不是Q10)。

但是,我想将搜索到的字段限制为“标题”字段。例如,_source文档有标题,正文,标签等,我只想搜索标题。 ElasticSearch“匹配”似乎对我来说......

{query: {match: {title: "blackberry -q10"}}}

虽然仅成功搜索标题,但仍会返回标题中包含Q10的结果,与上面的搜索不同。

我正在看the match documentation,但似乎无法弄明白。

谢谢!

2 个答案:

答案 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”子句。