1
我有一些彈性搜索與完成建議者的文檔。我尋找像堆棧一定的價值,結果顯示順序如下:彈性搜索中的自定義排序
- 堆棧溢出
- StackOverflow的
- 堆棧
- StackOver
- StackOverflow的
我希望結果按順序顯示:
- 堆棧
- StackOver
- StackOverflow的
- 堆棧溢出
- StackOverflow的
即,在苛求的比賽應該來,而不是結果其中第一個空格或特殊字符。 TIA
我有一些彈性搜索與完成建議者的文檔。我尋找像堆棧一定的價值,結果顯示順序如下:彈性搜索中的自定義排序
我希望結果按順序顯示:
即,在苛求的比賽應該來,而不是結果其中第一個空格或特殊字符。 TIA
這一切都取決於您分析您查詢的字符串的方式。我建議你在同一個字符串字段上應用多個分析器。下面是在你想自動完成/建議者特徵中的「名稱」字段映射的例子:
"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"
}
您可能需要基於上做了提升值的一些試驗,以達到最優化的結果你要求。希望這可以幫助。