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

実際には 1 つの結果が得られます (もちろん、説明フィールドのみを検索することになります)。

基本的に、複数のキーワードを使用して OR のような検索を行い、名前と説明フィールドの両方の値と比較するクエリを探しています。

4

1 に答える 1

6

Snowball は "savage" を "savag" に語幹化するため、"savage" という用語から結果が返されませんでした。ただし、URL に「savage」を指定すると、解析されて結果が得られます。意図に応じて、正しい語幹 ("savag") を使用するか、"terms" の代わりに "match" クエリを使用して用語を分析できます。

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