Elasticsearch反向match_phrase

时间:2015-09-25 09:28:48

标签: elasticsearch

请考虑以下文件:

{
  "Title": "Western Europe"
}

我想针对标题字段

运行此类搜索查询
  • 西欧的Apple
  • 东欧的Apple

我可以运行一个简单的匹配查询:

POST /_search
{
  "query": {
    "match": {
      "Title": "Apple in Western Europe"
    }
  }
}

无论我使用哪个搜索短语,它都会不经意地匹配并将其恢复。但是,我想提出一个查询,只有当标题字段短语匹配我的搜索查询时才能恢复我的文档。那可能吗?还有其他参数吗?这似乎是phrase matching的反面案例。

如果没有,我应该考虑用带状疱疹重建索引数据吗?

所以在这个场景中运行这个(带有附加参数)不会得分并带回我的文档。

POST /_search
{
  "query": {
    "match": {
      "Title": "Apple in Eastern Europe"
    }
  }
}

TL;博士

如果我的搜索查询中存在所有字段(我正在搜索的字段)令牌,如何编写将带回文档的查询? 例如,我的文档字段仅包含这两个标记:

  • ABC
  • XYZ

如果我的搜索短语是,例如 Lorem ipsum dolor sit amet,consectetur adipiscing elit abc xyz ,文档带回来

如果它是 Lorem ipsum dolor坐下来,这是 xyz ,那就是没有带回来

3 个答案:

答案 0 :(得分:1)

您可以使用过滤器查询(ES Documentation):

  1. 为您要匹配的查询编制索引
  2. 与与查询关联的元数据兼容
  3. 在搜索请求中发送文档
  4. 获取匹配的查询

您的用例示例

创建映射

  • query:接受具有所有强大功能的ES查询
  • Title:元数据(可选)
PUT /my_index
{
    "mappings": {
        "properties": {
            "Title": {
                "type": "text"
            },
            "query": {
                "type": "percolator"
            }
        }
    }
}

添加文档

PUT /my_index/_doc/1
{
  "query": {
    "match_phrase": {
      "Title": "Western Europe"
    }
  },
  "Title": "Western Europe"
}

获取匹配的查询

POST /my_index/_search
{
    "query": {
        "percolate": {
            "field": "query",
            "document": {
                "Title": "Apple in Western Europe"
            }
        }
    }
}

答案 1 :(得分:0)

尝试使用具有不同参数的“间隔查询”,这些参数可以为您提供帮助。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-intervals-query.html

答案 2 :(得分:0)

我知道Stefan在评论中给出了一个简单而有效的解决方案,但是您可能还想将Span Queries看作是仅供参考!

我已经创建了示例映射,文档,查询和响应:

映射:

PUT my_span_index
{
  "mappings": {
    "properties": {
      "Title":{
        "type": "text"
      }
    }
  }
}

样本文档:

POST my_span_index/_doc/1
{
  "Title": "Western Europe"
}

POST my_span_index/_doc/2
{
  "Title": "Eastern Europe"
}

//slop - distance between words Western and Europe here is 13
POST my_span_index/_doc/3
{
  "Title": "As far as Western culture is America, we see gradually more and more of the same in Europe"
}

跨度查询:

POST my_span_index/_search
{
    "query": {
        "span_near" : {
            "clauses" : [
                { "span_term" : { "Title": "western" } },
                { "span_term" : { "Title": "europe" } }
            ],
            "slop" : 12,                                <---- Distance Between Words
            "in_order" : true                           <---- If order is important
        }
    }
}

请注意,我使用了Span NearSpan Term Query并注意了上面的注释。

响应:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.5420371,
    "hits" : [
      {
        "_index" : "my_span_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5420371,
        "_source" : {
          "Title" : "Western Europe"
        }
      },
      {
        "_index" : "my_span_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.028773852,
        "_source" : {
          "Title" : "As far as Western culture is America, we see gradually more and more of the same in Europe"
        }
      }
    ]
  }
}

请注意,在响应中还会返回具有id:3的文档,但是,如果将斜率更改为较小的值,则不会出现。

痛苦的是,如果您的请求要有更多的令牌,您最终将在应用程序端编写/生成长查询。

希望我能帮上忙!