0

I'm working with ElasticSearch. When I do this query:

{query: "blackberry -q10"}

I get exactly what I want (all results which have reference to BlackBerry but not Q10).

However, I want to restrict the fields which are searched to just the "title" field. Eg, the _source documents have titles, body, tags, etc. and I only want to search the title. The ElasticSearch "Match" seems right for me...

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

While this succeeds in only searching the title, it still returns results with have Q10 in the title, unlike the search above.

I'm looking at the match documentation but can't seem to figure it out.

Thanks!

4

2 回答 2

1

Match 查询不使用这样的否定语法。例如,您不能使用“减号”来否定一个术语。默认搜索分析器会将其解析为连字符。

在这种情况下,我会使用过滤查询。您可以在查询中添加否定...但是过滤器会快得多。

{
  "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 需要正确的语法,如果用户输入不正确,它就会死掉。它还允许您的用户进行一些可怕的低效查询,通常通过通配符

于 2013-01-31T15:57:30.203 回答
0

您想匹配所有具有“blackberry”且没有 q10 的标题,而不是所有具有“blackberry”或没有 q10 的标题。

匹配的默认布尔运算符是(在大多数情况下)OR。尝试在查询中添加 "operator": "and" 子句。

于 2013-01-31T15:37:06.093 回答