3

次のようなエラスティック検索のドキュメントがあります...

{
    "items":
    [
        "ONE BLAH BLAH BLAH TWO BLAH BLAH BLAH THREE",
        "FOUR BLAH BLAH BLAH FIVE BLAH BLAH BLAH SIX"
    ]
}

このドキュメントを次のような語句クエリで検索できるようにしたい...

{
    "match_phrase" : {
        "items" : "ONE TWO THREE"
    }
}

間にある単語に関係なく一致するように。単語もその順序である必要があります。これはプロパティを介して達成できることを認識していslopますが、それを実験していたとき、スロップが検索していた単語の間の単語よりも多い場合、ラップするように見えました。スロップが適しているとは思わない。また、配列内のアイテムごとにのみ検索する必要があるため...

{
    "match_phrase" : {
        "items" : "ONE TWO SIX"
    }
}

SIXの配列内の別の項目にあるため、このドキュメントと一致しません。ONETWO

だから私の質問は、これはelasticsearchを介して可能ですか、それともオブジェクトの配列を作成し、ネストされたクエリを使用してそれらを検索する必要がありますか?

4

1 に答える 1

12

Span Near Queryを使用して実行できます。あなたの実験で何がうまくいかなかったのか、そして「ラッピング」の意味がわかりません。おそらく、「in_order」:「false」を指定し、クエリが用語の順序を無視しているだけだと推測できます。例を挙げていただけますか?

クエリが複数のアイテムにまたがるのを避けるには、「position_offset_gap」プロパティを使用して、マッピングでアイテム間の「ギャップ」を増やす必要があります。次に例を示します。

curl -XDELETE "localhost:9200/slop-test"
echo
curl -XPUT "localhost:9200/slop-test" -d '{
  "settings" : {
    "index" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 0
    }    
  },
  "mappings" : {
    "doc" : {
      "properties" : {
        "items" : {
          "type" : "string",
          "position_offset_gap": 100
        }
      }
    }
  }
}'
echo
curl -XPUT "localhost:9200/slop-test/doc/1" -d '{
  "items":
  [
      "ONE BLAH BLAH BLAH TWO BLAH BLAH BLAH THREE",
      "FOUR BLAH BLAH BLAH FIVE BLAH BLAH BLAH SIX"
  ]
}'
curl -XPOST "localhost:9200/slop-test/_refresh"
echo
curl "localhost:9200/slop-test/_search?pretty=true" -d '{
  "query" : {
    "span_near" : {
      "clauses" : [
        { "span_term" : { "items" : "one" } },
        { "span_term" : { "items" : "two" } },
        { "span_term" : { "items" : "three" } }
      ],
      "slop" : 40,
      "in_order" : true
    }
  }
}'
echo
curl "localhost:9200/slop-test/_search?pretty=true" -d '{
  "query" : {
    "span_near" : {
      "clauses" : [
        { "span_term" : { "items" : "one" } },
        { "span_term" : { "items" : "two" } },
        { "span_term" : { "items" : "six" } }
      ],
      "slop" : 40,
      "in_order" : true
    }
  }
}'
echo
于 2012-09-25T17:24:45.000 に答える