2017-03-03 86 views
1

我有一些彈性搜索與完成建議者的文檔。我尋找像堆棧一定的價值,結果顯示順序如下:彈性搜索中的自定義排序

  1. 堆棧溢出
  2. StackOverflow的
  3. 堆棧
  4. StackOver
  5. StackOverflow的

我希望結果按順序顯示:

  1. 堆棧
  2. StackOver
  3. StackOverflow的
  4. 堆棧溢出
  5. StackOverflow的

即,在苛求的比賽應該來,而不是結果其中第一個空格或特殊字符。 TIA

回答

1

這一切都取決於您分析您查詢的字符串的方式。我建議你在同一個字符串字段上應用多個分析器。下面是在你想自動完成/建議者特徵中的「名稱」字段映射的例子:

"name": { 
    "type": "string", 
    "analyzer": "keyword_analyzer", 
    "fields": { 
     "name_ac": { 
      "type": "string", 
      "index_analyzer": "string_autocomplete_analyzer", 
      "search_analyzer": "keyword_analyzer" 
     } 
    } 
} 

這裏,keyword_analyzer和string_autocomplete_analyzer的分析儀在索引設置中定義。下面是一個例子:

"keyword_analyzer": { 
    "type": "custom", 
    "filter": [ 
     "lowercase" 
    ], 
    "tokenizer": "keyword" 
} 

"string_autocomplete_analyzer": { 
    "type": "custom", 
    "filter": [ 
     "lowercase" 
     , 
     "autocomplete" 
    ], 
    "tokenizer": "whitespace" 
} 

這裏自動完成是一個分析過濾器:

"autocomplete": { 
    "type": "edgeNGram", 
    "min_gram": "1", 
    "max_gram": "10" 
} 

將其具有在此之後,在Elasticsearch爲自動建議搜索時,你可以利用multiMatch的查詢,而不是正常匹配查詢,並在這裏提供對multiMatch中各個字段的提升。以下是java中的示例:

QueryBuilders.multiMatchQuery(yourSearchString,"name^3","name_ac"); 

您可能需要根據需要更改提升(^ 3)。

如果即使這樣也不能滿足您的要求,您可以考慮讓另一臺分析儀根據第一個詞分析字符串並在multiMatch中包含該字段。下面是這樣一個分析的例子:

"first_word_name_analyzer": { 
    "type": "custom", 
    "filter": [ 
     "lowercase" 
     , 
     "whitespace_merge" 
     , 
     "edgengram" 
    ], 
    "tokenizer": "keyword" 
} 

有了這些分析濾波器:

"whitespace_merge": { 
    "pattern": "\s+", 
    "type": "pattern_replace", 
    "replacement": " " 
}, 
"edgengram": { 
    "type": "edgeNGram", 
    "min_gram": "1", 
    "max_gram": "32" 
} 

您可能需要基於上做了提升值的一些試驗,以達到最優化的結果你要求。希望這可以幫助。