2015-01-06 2 views
0

Я просил elasticsearch nested filter return empty result о некоторой ошибке, которую я имею в запросе, и не получаю никаких результатов, но в ответе мне было указано, что выражение, которое я использую для фильтра, не анализировалось как я ожидать.Elasticsearch использует пользовательский анализатор на фильтре

У меня есть пользовательский анализатор, чтобы сделать работу, как я могу указать в следующем запросе к фильтру использовать этот пользовательский анализатор:

GET /develop/_search?search_type=dfs_query_then_fetch 
{ 
    "query": { 
    "filtered" : { 
     "query": { 
      "bool": { 
      "must": [ 
       { "match": { "title": "post" }} 
      ] 
      } 
     }, 
     "filter": { 
      "bool": { 
      "must": [ 
       {"term": { 
       "featured": 0 
       }}, 
       { 
       "nested": { 
       "path": "seller", 
       "filter": { 
        "bool": { 
        "must": [ 
         { "term": { "seller.firstName": "Test 3" } } 
        ] 
        } 
       }, 
       "_cache" : true 
       }} 
      ] 
      } 
     } 
    } 
    }, 
    "sort": [ 
    { 
     "_score":{ 
     "order": "desc" 
     } 
    },{ 
     "created": { 
     "order": "desc" 
     } 
    } 
    ], 
    "track_scores": true 
} 

ответ

1

Вот подстава, которая, кажется, что вы хотите. Я использовал тот же базовый код, как последний ответ, но использовал index_analyzer и search_analyzer в определении индекса следующим образом:

curl -XDELETE "http://localhost:9200/my_index" 

curl -XPUT "http://localhost:9200/my_index" -d' 
{ 
    "settings": { 
     "number_of_shards": 1, 
     "number_of_replicas": 0, 
     "analysis": { 
     "filter": { 
      "snowball": { "type": "snowball", "language": "English" }, 
      "english_stemmer": { "type": "stemmer", "language": "english" }, 
      "english_possessive_stemmer": { "type": "stemmer", "language": "possessive_english" }, 
      "stopwords": { "type": "stop", "stopwords": [ "_english_" ] }, 
      "worddelimiter": { "type": "word_delimiter" } 
     }, 
     "tokenizer": { 
      "nGram": { "type": "nGram", "min_gram": 3, "max_gram": 20 } 
     }, 
     "analyzer": { 
      "custom_analyzer": { 
       "type": "custom", 
       "tokenizer": "nGram", 
       "filter": [ 
        "stopwords", 
        "asciifolding", 
        "lowercase", 
        "snowball", 
        "english_stemmer", 
        "english_possessive_stemmer", 
        "worddelimiter" 
       ] 
      }, 
      "custom_search_analyzer": { 
       "type": "custom", 
       "tokenizer": "standard", 
       "filter": [ 
        "stopwords", 
        "asciifolding", 
        "lowercase", 
        "snowball", 
        "english_stemmer", 
        "english_possessive_stemmer", 
        "worddelimiter" 
       ] 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "posts": { 
     "properties": { 
      "title": { 
       "type": "string", 
       "analyzer": "custom_analyzer", 
       "boost": 5 
      }, 
      "seller": { 
       "type": "nested", 
       "properties": { 
        "firstName": { 
        "type": "string", 
        "index_analyzer": "custom_analyzer", 
        "search_analyzer": "custom_search_analyzer", 
        "boost": 3 
        } 
       } 
      } 
     } 
     } 
    } 
}' 

Затем добавляет Тест Документам

curl -XPUT "http://localhost:9200/my_index/posts/1" -d' 
{"title": "post", "seller": {"firstName":"Test 1"}}' 
curl -XPUT "http://localhost:9200/my_index/posts/2" -d' 
{"title": "post", "seller": {"firstName":"Test 2"}}' 
curl -XPUT "http://localhost:9200/my_index/posts/3" -d' 
{"title": "post", "seller": {"firstName":"Test 3"}}' 

А потом пару match запросов в bool, где один является multiword query, кажется, сделать то, что вы хотели:

curl -XPOST "http://localhost:9200/my_index/_search" -d' 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "match": { 
        "title": "post" 
       } 
      }, 
      { 
       "nested": { 
        "path": "seller", 
        "query": { 
        "match": { 
         "seller.firstName": { 
          "query": "Test 3", 
          "operator": "and" 
         } 
        } 
        } 
       } 
      } 
     ] 
     } 
    } 
}' 
... 
{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 6.8380365, 
     "hits": [ 
     { 
      "_index": "my_index", 
      "_type": "posts", 
      "_id": "3", 
      "_score": 6.8380365, 
      "_source": { 
       "title": "post", 
       "seller": { 
        "firstName": "Test 3" 
       } 
      } 
     } 
     ] 
    } 
} 

Здесь код, который я использовал:

http://sense.qbox.io/gist/8cd954aa60be8c44f64e4282e15e6b565c945ecb

что Решает ли проблему?

Смежные вопросы