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属性来实现,但是当我尝试它时,如果斜率超过我正在搜索的单词之间的单词,并且因为这是我不知道的单词数量,它似乎会换行。 t认为slop是合适的。另外我只需要搜索数组中的每个项目,所以......

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

SIX不会像在数组中的不同项目中那样将此文档与 和ONE匹配TWO

所以我的问题是,这是否可以通过 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 回答