1

我在 Elastic search 1.4 短语查询中遇到问题。我正在使用数据创建以下索引。

curl -XPUT localhost:9200/test

curl -XPOST localhost:9200/test/doc/1 -d '{"field1" : "abc-xyz"}'

curl -XPOST localhost:9200/test/doc/2 -d '{"field1" : "bcd-gyz"}'

因此,默认情况下 field1 通过弹性搜索使用默认分析器进行分析。

我正在下面的短语查询中搜索,但它没有返回任何结果。

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "query": {
                "multi_match": {
                  "query": "abc\\-xyz OR bcd\\-gyz",
                  "type": "phrase",
                  "fields": [
                    "field1"
                  ]
                }
              }
            }
          ]
        }
      }
    }
  }
}

所以弹性搜索短语查询不适用于 OR 运算符。知道为什么它不起作用,是否因为文本中的特殊字符连字符 (-) 而限制了弹性搜索?

4

2 回答 2

1

根据评论,使用查询字符串添加一个答案,该字符串适用OR于多个搜索的短语,它不适用于多个多重匹配,因此必须使用query string.

使用相同的索引文档,在上一个答案中添加,但使用以下搜索查询。

{
    "query": {
        "bool": {
            "must": [
                {
                    "query_string": {
                        "query": "\"abc-xyz\" OR \"bcd-gyz\"",
                        "fields": [
                            "title"
                        ]
                    }
                }
            ]
        }
    }
}

搜索结果

 "hits": [
            {
                "_index": "phrasemulti",
                "_type": "doc",
                "_id": "1",
                "_score": 0.05626005,
                "_source": {
                    "title": "bcd-gyz"
                }
            },
            {
                "_index": "phrasemulti",
                "_type": "doc",
                "_id": "2",
                "_score": 0.05626005,
                "_source": {
                    "title": "abc-xyz"
                }
            }
        ]

当您删除几个字符时,pharse查询将不起作用,或者当您将运算符更改为 时AND,示例数据不会返回预期的搜索结果。

{
    "query": {
        "bool": {
            "must": [
                {
                    "query_string": {
                        "query": "\"abc-xyz\" OR \"bcd-gz\"",
                        "fields": [
                            "title"
                        ]
                    }
                }
            ]
        }
    }
}

仅返回一个搜索结果,因为bcd-gz样本数据中不存在短语。

  "hits": [
            {
                "_index": "phrasemulti",
                "_type": "doc",
                "_id": "2",
                "_score": 0.05626005,
                "_source": {
                    "title": "abc-xyz"
                }
            }
        ]
于 2021-02-14T08:45:48.120 回答
0

下面的查询对我来说很好

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": [
                        {
                            "query": {
                                "multi_match": {
                                    "query": "abc-xyz", // note passing only one query without escaping hyphen 
                                    "type": "phrase",
                                    "fields": [
                                        "title"
                                    ]
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

带有解释参数的搜索结果

 "hits": [
            {
                "_shard": 3,
                "_node": "1h3iipehS2abfclj51Vtsg",
                "_index": "phrasemulti",
                "_type": "doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "title": "abc-xyz"
                },
                "_explanation": {
                    "value": 1.0,
                    "description": "ConstantScore(BooleanFilter(QueryWrapperFilter(title:\"abc xyz\"))), product of:",
                    "details": [
                        {
                            "value": 1.0,
                            "description": "boost"
                        },
                        {
                            "value": 1.0,
                            "description": "queryNorm"
                        }
                    ]
                }
            }
        ]

根据短语验证其返回结果,因为查询abc-xy不返回任何结果。

于 2021-02-13T06:18:54.343 回答