Đây là giải pháp tôi đã kết thúc với, dựa trên câu trả lời Andrei và mở rộng để hỗ trợ nhiều thuật ngữ tìm kiếm và chấm điểm bổ sung dựa trên chiều dài của từ đầu tiên trong kết quả:
Đầu tiên, xác định các phân tích tùy chỉnh sau (nó giữ toàn bộ chuỗi như là một dấu hiệu duy nhất và lowercases nó):
"raw_analyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"tokenizer": "keyword"
}
thứ hai, xác định bản đồ trường tìm kiếm của bạn như vậy ("tên" tên tôi của):
"name": {
"type": "string",
"analyzer": "english",
"fields": {
"raw": {
"type": "string",
"index_analyzer": "raw_analyzer",
"search_analyzer": "standard"
}
}
},
"_nameFirstWordLength": {
"type": "long"
}
Thứ ba, khi Populating chỉ số sử dụng logic sau đây (tôi là trong C#) để cư trú:
_nameFirstWordLength = fi.Name.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)[0].Length
Cuối cùng, làm tìm kiếm của bạn như sau:
{
"query":{
"bool":{
"must":{
"match_phrase_prefix":{
"name":{
"query":"apple"
}
}
},
"should":{
"function_score":{
"query":{
"query_string":{
"fields":[
"name.raw"
],
"query":"apple*"
}
},
"script_score":{
"script":"100/doc['_nameFirstWordLength'].value"
},
"boost_mode":"replace"
}
}
}
}
}
Tôi đang sử dụng match_phrase_prefix để phần các đối sánh được hỗ trợ, chẳng hạn như "ap" khớp với "quả táo". Các bool phải/nên với query_string truy vấn thứ hai với name.raw cho một điểm số cao hơn để kết quả có tên bắt đầu với một trong các điều kiện tìm kiếm (trong mã của tôi tôi đang xử lý trước chuỗi tìm kiếm, chỉ cho truy vấn thứ hai, thêm "*" sau mỗi từ). Cuối cùng, gói truy vấn thứ hai đó trong kịch bản lệnh function_score sử dụng giá trị _nameFirstWordLength khiến kết quả được ghi bởi truy vấn thứ hai được sắp xếp thêm theo độ dài từ đầu tiên của chúng (ví dụ như Apple hiển thị trước Applebee).
Có thể điều này sẽ giúp http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-advanced-scripting.html –
Nó sẽ, tôi đã bắt đầu đi xuống con đường đó, cho đến khi tôi phát hiện ra rằng kịch bản không có quyền truy cập vào chuỗi tìm kiếm được mã hóa: ( – IGx89