6

我有一个非常简单的映射,如下所示(我简化了示例):

{
    "location" : {
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" }
        }
    }
}

现在我使用一些基于真实英语单词的随机值来索引很多位置。

我希望能够在名称或描述字段中搜索与任何给定关键字匹配的位置(名称更重要,因此我给予了提升)。我尝试了一些不同的查询,但它们没有返回任何结果。

{
    "fields" : ["name", "description"],
    "query" : {
        "terms" : {
            "name" : ["savage"],
            "description" : ["savage"]
        },
        "from" : 0,
        "size" : 500
    }
}

考虑到在描述中有savaged这个词的位置,它应该会给我一些结果(savagesavaged的​​词干)。使用上述查询产生 0 个结果。我一直在使用 curl 来查询 ES:

curl -XGET -d @query.json http://localhost:9200/myindex/locations/_search

如果我改用查询字符串:

curl -XGET http://localhost:9200/fieldtripfinder/locations/_search?q=description:savage

我实际上得到了一个结果(当然现在它只会搜索描述字段)。

基本上,我正在寻找一个查询,它将使用多个关键字进行 OR 类型的搜索,并将它们与名称和描述字段中的值进行比较。

4

1 回答 1

6

Snowball 将“savage”变成“savag”,这就是“savage”一词没有返回任何结果的原因。但是,当您在 URL 上指定“savage”时,会对其进行分析并获得结果。根据您的意图,您可以使用正确的词干(“savag”)或使用“match”查询而不是“terms”来分析您的术语:

{
  "fields" : ["name", "description"],
  "query" : {
    "bool" : {
      "should" : [
        {"match" : {"name" : "savage"}},
        {"match" : {"description" : "savage"}}
      ]
    },
    "from" : 0,
    "size" : 500
  }
}
于 2011-07-20T17:49:04.347 回答