【问题标题】:Elasticsearch/Lucene Regex fquery/query_string not returning all documentsElasticsearch/Lucene Regex fquery/query_string 不返回所有文档
【发布时间】:2015-11-26 02:49:34
【问题描述】:

我目前在 Elasticsearch 中有这个映射,我正在使用 not_analyzed 字段进行索引:

PUT /twitter/_mapping/tweet
{
    "tweet": {
        "properties" : {
            "user" : {
                "type" : "string",
                "index": "not_analyzed"
            }
        }
    }
}


PUT /twitter/tweet/1
{
    "user": "CNN"
}
PUT /twitter/tweet/2
{
    "user": "cnn"
}
PUT /twitter/tweet/3
{
    "user": "Cnn"
}
PUT /twitter/tweet/4
{
    "user": "cNN"
}
PUT /twitter/tweet/5
{
    "user": "CnN"
}

我想使用类似这样的不区分大小写的过滤器搜索此索引(通过 NEST 生成,因此在更改此查询语法时不太灵活):

POST /twitter/tweet/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "fquery": {
                "query": {
                  "query_string": {
                    "query": "user:/[cC][nN][nN]/"
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

此查询仅返回 1 个文档:"user": "cnn"(小写),而不是所有文档。

这是为什么?与"query": "user:CNN" 相同的查询返回具有正确大小写(大写)的正确文档。

编辑:另外,如果我删除带有cnn(小写)的文档,查询不会返回任何内容。

编辑 2:如果这是我的 NEST 代码的问题,这里是用于生成查询的代码:

// property path would be something like "user". queryTerm would be something like "cnn"
filterDescriptor.Query(
  q =>
    q.QueryString(
      d =>
        d.Query(string.Format("{0}:{1}", propertyPath,
          GetCaseInsentitiveRegexExpression(queryTerm))))); // returns something like /[cC][nN][nN]/

【问题讨论】:

    标签: regex elasticsearch lucene nest


    【解决方案1】:

    您需要设置lowercase_expanded_terms:false。默认情况下,lowercase_expanded_terms 设置为 true,其中小写通配符、正则表达式查询。

    例子:

    POST /twitter/tweet/_search
    {
      "from": 0,
      "size": 10,
      "query": {
        "filtered": {
          "filter": {
            "bool": {
              "must": [
                {
                  "fquery": {
                    "query": {
                      "query_string": {
                        "query": "user:/[Cc][nN][nN]/",
                        "lowercase_expanded_terms": false 
    
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    或者在嵌套代码中它会是这些行上的东西

    q.QueryString(
          d =>
            d.Query(string.Format("{0}:{1}", propertyPath,
              GetCaseInsentitiveRegexExpression(queryTerm))).LowercaseExpendedTerms(false))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2017-07-30
      • 2014-05-20
      • 2021-08-11
      • 2021-10-31
      相关资源
      最近更新 更多