4

I'm trying to do a wildcard query with spaces. It easily matches the words on term basis but not on field basis.

I've read the documentation which says that I need to have the field as not_analyzed but with this type set, it returns nothing.

This is the mapping with which it works on term basis:

{
  "denshop" : {
    "mappings" : {
      "products" : {
        "properties" : {
          "code" : {
            "type" : "string"
          },
          "id" : {
            "type" : "long"
          },
          "name" : {
            "type" : "string"
          },
          "price" : {
            "type" : "long"
          },
          "url" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

This is the mapping with which the exact same query returns nothing:

{
  "denshop" : {
    "mappings" : {
      "products" : {
        "properties" : {
          "code" : {
            "type" : "string"
          },
          "id" : {
            "type" : "long"
          },
          "name" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "price" : {
            "type" : "long"
          },
          "url" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

The query is here:

curl -XPOST http://127.0.0.1:9200/denshop/products/_search?pretty -d '{"query":{"wildcard":{"name":"*test*"}}}'

Response with the not_analyzed property:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

Response without not_analyzed:

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 1.0,
    "hits" : [ {
    ...

EDIT: Adding requested info

Here is the list of documents:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "denshop",
      "_type" : "products",
      "_id" : "3L1",
      "_score" : 1.0,
      "_source" : {
        "id" : 3,
        "name" : "Testovací produkt 2",
        "code" : "",
        "price" : 500,
        "url" : "http://www.denshop.lh/damske-obleceni/testovaci-produkt-2/"
      }
    }, {
      "_index" : "denshop",
      "_type" : "products",
      "_id" : "4L1",
      "_score" : 1.0,
      "_source" : {
        "id" : 4,
        "name" : "Testovací produkt 3",
        "code" : "",
        "price" : 666,
        "url" : "http://www.denshop.lh/damske-obleceni/testovaci-produkt-3/"
      }
    }, {
      "_index" : "denshop",
      "_type" : "products",
      "_id" : "2L1",
      "_score" : 1.0,
      "_source" : {
        "id" : 2,
        "name" : "Testovací produkt",
        "code" : "",
        "price" : 500,
        "url" : "http://www.denshop.lh/damske-obleceni/testovaci-produkt/"
      }
    }, {
      "_index" : "denshop",
      "_type" : "products",
      "_id" : "5L1",
      "_score" : 1.0,
      "_source" : {
        "id" : 5,
        "name" : "Testovací produkt 4",
        "code" : "",
        "price" : 666,
        "url" : "http://www.denshop.lh/damske-obleceni/testovaci-produkt-4/"
      }
    }, {
      "_index" : "denshop",
      "_type" : "products",
      "_id" : "6L1",
      "_score" : 1.0,
      "_source" : {
        "id" : 6,
        "name" : "Testovací produkt 5",
        "code" : "",
        "price" : 666,
        "url" : "http://www.denshop.lh/tricka-tilka-tuniky/testovaci-produkt-5/"
      }
    } ]
  }
}

Without the not_analyzed it returns with this:

curl -XPOST http://127.0.0.1:9200/denshop/products/_search?pretty -d '{"query":{"wildcard":{"name":"*testovací*"}}}'

But not with this (notice the space before asterisk):

curl -XPOST http://127.0.0.1:9200/denshop/products/_search?pretty -d '{"query":{"wildcard":{"name":"*testovací *"}}}'

When I add the not_analyzed to mapping, it returns no hits no matter what I put in the wildcard query.

4

1 回答 1

5

添加一个应该小写文本的自定义分析器。然后在您的搜索查询中,在将文本传递给它之前,在您的客户端应用程序中将其小写

为了保持原始分析链,我在您的字段中添加了一个子name字段,它将使用自定义分析器。

PUT /denshop
{
  "settings": {
    "analysis": {
      "analyzer": {
        "keyword_lowercase": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "products": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "lowercase": {
              "type": "string",
              "analyzer": "keyword_lowercase"
            }
          }
        }
      }
    }
  }
}

查询将在子字段上工作:

GET /denshop/products/_search
{
  "query": {
    "wildcard": {
      "name.lowercase": "*testovací *"
    }
  }
}
于 2016-05-03T21:07:29.810 回答