2013-05-07 16 views
6

Tôi đã có ba tài liệu với một lĩnh vực "userName":ElasticSearch một edgeNGram cho autocomplete typeahead, là search_analyzer tôi bị bỏ qua

  • 'briandilley'
  • 'briangumble'
  • 'briangriffen'

khi tôi tìm kiếm 'brian' tôi nhận được tất cả ba trở lại như mong đợi, nhưng khi tôi tìm kiếm 'briandilley' tôi vẫn nhận được tất cả ba trở lại. API phân tích cho tôi biết rằng nó đang sử dụng bộ lọc ngram trên chuỗi tìm kiếm của tôi, nhưng tôi không chắc chắn tại sao. đây là thiết lập của tôi:

thiết lập chỉ mục:

{ 
    "analysis": { 
     "analyzer": { 
      "username_index": { 
       "tokenizer": "keyword", 
       "filter": ["lowercase", "username_ngram"] 
      }, 
      "username_search": { 
       "tokenizer": "keyword", 
       "filter": ["lowercase"] 
      } 
     }, 
     "filter": { 
      "username_ngram": { 
       "type": "edgeNGram", 
       "side" : "front", 
       "min_gram": 1, 
       "max_gram": 15 
      } 
     } 
    } 
} 

lập bản đồ:

{ 
    "user_follow": { 

     "properties": { 
      "targetId": { "type": "string", "store": true }, 
      "followerId": { "type": "string", "store": true }, 
      "dateUpdated": { "type": "date", "store": true }, 

      "userName": { 
       "type": "multi_field", 
       "fields": { 
        "userName": { 
         "type": "string", 
         "index": "not_analyzed" 
        }, 
        "autocomplete": { 
         "type": "string", 
         "index_analyzer": "username_index", 
         "search_analyzer": "username_search" 
        } 
       } 
      } 
     } 
    } 
} 

tìm kiếm:

{ 
    "from" : 0, 
    "size" : 50, 
    "query" : { 
     "bool" : { 
      "must" : [ { 
       "field" : { 
        "targetId" : "51888c1b04a6a214e26a4009" 
       } 
      }, { 
       "match" : { 
        "userName.autocomplete" : { 
         "query" : "brian", 
         "type" : "boolean" 
        } 
       } 
      } ] 
     } 
    }, 
    "fields" : "followerId" 
} 

tôi đã thử matchQuery, matchPhraseQuery, textQuery và termQuery (java DSL api) và tôi nhận được kết quả tương tự mỗi lần.

Trả lời

9

Tôi nghĩ rằng bạn không làm chính xác những gì bạn nghĩ mình đang làm. Đây là lý do tại sao hữu ích khi trình bày một trường hợp thử nghiệm thực tế với các tuyên bố đầy đủ curl, thay vì viết tắt nó.

dụ của bạn trên các công trình đối với tôi (một chút thay đổi):

Tạo chỉ số với các thiết lập và lập bản đồ:

curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1' -d ' 
{ 
    "mappings" : { 
    "test" : { 
     "properties" : { 
      "userName" : { 
       "fields" : { 
       "autocomplete" : { 
        "search_analyzer" : "username_search", 
        "index_analyzer" : "username_index", 
        "type" : "string" 
       }, 
       "userName" : { 
        "index" : "not_analyzed", 
        "type" : "string" 
       } 
       }, 
       "type" : "multi_field" 
      } 
     } 
    } 
    }, 
    "settings" : { 
    "analysis" : { 
     "filter" : { 
      "username_ngram" : { 
       "max_gram" : 15, 
       "min_gram" : 1, 
       "type" : "edge_ngram" 
      } 
     }, 
     "analyzer" : { 
      "username_index" : { 
       "filter" : [ 
       "lowercase", 
       "username_ngram" 
       ], 
       "tokenizer" : "keyword" 
      }, 
      "username_search" : { 
       "filter" : [ 
       "lowercase" 
       ], 
       "tokenizer" : "keyword" 
      } 
     } 
    } 
    } 
} 
' 

Index một số dữ liệu:

curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d '{ 
    "userName" : "briangriffen" 
} 
' 

curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d ' 
{ 
    "userName" : "brianlilley" 
} 
' 

curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d ' 
{ 
    "userName" : "briangumble" 
} 
' 

Một tìm kiếm cho brian phát hiện tất cả tài liệu:

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '{ 
    "query" : { 
    "match" : { 
     "userName.autocomplete" : "brian" 
    } 
    } 
} 
' 

# { 
# "hits" : { 
#  "hits" : [ 
#   { 
#    "_source" : { 
#    "userName" : "briangriffen" 
#    }, 
#    "_score" : 0.1486337, 
#    "_index" : "test", 
#    "_id" : "AWzezvEFRIykOAr75QbtcQ", 
#    "_type" : "test" 
#   }, 
#   { 
#    "_source" : { 
#    "userName" : "briangumble" 
#    }, 
#    "_score" : 0.1486337, 
#    "_index" : "test", 
#    "_id" : "qIABuMOiTyuxLOiFOzcURg", 
#    "_type" : "test" 
#   }, 
#   { 
#    "_source" : { 
#    "userName" : "brianlilley" 
#    }, 
#    "_score" : 0.076713204, 
#    "_index" : "test", 
#    "_id" : "fGgTITKvR6GJXI_cqA4Vzg", 
#    "_type" : "test" 
#   } 
#  ], 
#  "max_score" : 0.1486337, 
#  "total" : 3 
# }, 
# "timed_out" : false, 
# "_shards" : { 
#  "failed" : 0, 
#  "successful" : 5, 
#  "total" : 5 
# }, 
# "took" : 8 
# } 

Một tìm kiếm cho brianlilley thấy chỉ tài liệu:

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d ' 
{ 
    "query" : { 
    "match" : { 
     "userName.autocomplete" : "brianlilley" 
    } 
    } 
} 
' 

# { 
# "hits" : { 
#  "hits" : [ 
#   { 
#    "_source" : { 
#    "userName" : "brianlilley" 
#    }, 
#    "_score" : 0.076713204, 
#    "_index" : "test", 
#    "_id" : "fGgTITKvR6GJXI_cqA4Vzg", 
#    "_type" : "test" 
#   } 
#  ], 
#  "max_score" : 0.076713204, 
#  "total" : 1 
# }, 
# "timed_out" : false, 
# "_shards" : { 
#  "failed" : 0, 
#  "successful" : 5, 
#  "total" : 5 
# }, 
# "took" : 4 
# } 
+0

tôi đang làm điều này trong một thử nghiệm đơn vị java - vì vậy đó là lý do tại sao không có bất kỳ báo cáo CURL (sử dụng trong ứng dụng bộ nhớ). –

+0

Vâng, rất có thể bạn đang làm điều gì đó sai ở đó. Bằng cách tái tạo nó như curl, bạn có thể xem liệu bạn có thể tạo lại vấn đề hay không. Nếu bạn không thể, thì vấn đề nằm trong mã Java của bạn. (Tôi có nghĩa là sản xuất các câu lệnh curl bằng tay, mà bạn có thể làm) – DrTech

+0

Bạn đã đúng - tôi đã lập chỉ mục tên người dùng của mục tiêu thay vì tên người dùng của người theo dõi. Về cơ bản chỉ mục xấu về phía tôi. Tôi đã đánh dấu câu trả lời của bạn là câu trả lời đúng vì bạn đã giúp đưa tôi đến vấn đề thực sự là gì. –

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