2014-07-17 27 views
10

Tôi đang cố gắng để tìm kiếm cơ sở dữ liệu của tôi và có thể sử dụng thuật ngữ lọc/chữ thường trên nhưng tôi đã nhận thấy trong khi query 's áp dụng phân tích, tôi không thể tìm ra cách để áp dụng một máy phân tích chữ thường trên tìm kiếm được lọc. Dưới đây là các truy vấn:Elasticsearch lọc chữ thường tìm kiếm

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "should": [ 
         { 
          "term": { 
           "language": "mandarin" // Returns a doc 
          } 
         }, 
         { 
          "term": { 
           "language": "Italian" // Does NOT return a doc, but will if lowercased 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

Tôi có một loại languages mà tôi đã lowercased sử dụng:

"analyzer": { 
    "lower_keyword": { 
     "type": "custom", 
     "tokenizer": "keyword", 
     "filter": "lowercase" 
    } 
} 

và một ánh xạ tương ứng:

"mappings": { 
    "languages": { 
     "_id": { 
      "path": "languageID" 
     }, 
     "properties": { 
      "languageID": { 
       "type": "integer" 
      }, 
      "language": { 
       "type": "string", 
       "analyzer": "lower_keyword" 
      }, 
      "native": { 
       "type": "string", 
       "analyzer": "keyword" 
      }, 
      "meta": { 
       "type": "nested" 
      }, 
      "language_suggest": { 
       "type": "completion" 
      } 
     } 
    } 
} 

Trả lời

7

Vấn đề là bạn có một trường bạn đã phân tích trong chỉ mục để viết chữ thường, nhưng bạn đang sử dụng bộ lọc thuật ngữ cho truy vấn không được phân tích:

Term Lọc

lọc tài liệu mà có các trường có chứa một thuật ngữ (không được phân tích). Tương tự như truy vấn cụm từ, ngoại trừ việc nó hoạt động như một bộ lọc.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-filter.html

Tôi muốn thử sử dụng một bộ lọc truy vấn thay vì:

Query Lọc

Wraps bất kỳ truy vấn được sử dụng như một bộ lọc. Có thể được đặt trong các truy vấn chấp nhận bộ lọc.

Ví dụ:

{ 
    "constantScore" : { 
     "filter" : { 
      "query" : { 
       "query_string" : { 
        "query" : "this AND that OR thus" 
       } 
      } 
     } 
    } } 

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-filter.html#query-dsl-query-filter

+1

Vì vậy, nếu tôi muốn tho hạn được lowercased tôi sẽ thay đổi tokenizer thành một chữ thường và lập chỉ mục tất cả mọi thứ? – Maruf

+0

Không, nó đã được hạ thấp trong khi lập chỉ mục do bộ lọc chữ thường. Vấn đề là bạn cần phải sử dụng một loại truy vấn cũng sẽ phân tích - Bộ lọc thuật ngữ không. –

+2

Bạn sẽ thấy hiệu suất tốt hơn nếu bạn vừa hạ thấp đầu vào của mình để có thể tiếp tục sử dụng Bộ lọc cụm từ qua sử dụng Bộ lọc truy vấn? – odyth

Các vấn đề liên quan