我在產品搜索應用程序中有類似的問題/挑戰我想按品牌分組產品,例如
Nikon
Nikos
要解決此問題,我正在試驗Suggester 。背後的想法是,建議者會爲我提供我的搜索建議。這些建議將被分組,並且不會對所有文檔重複(即使可能有其他文字)。您可以使用Term Suggester或Phrase Suggester
但是,此方法需要您更改結果的處理。您必須將建議顯示爲組並單獨處理搜索結果。這種方法的優點是你不必自己分組。
另一種解決方案是使用帶狀皰疹的Terms Aggregation。這種聚合將分組詞組(帶狀皰疹)。但是,要獲得結果,必須採取所有聚合並將其與查詢輸入相匹配。見示例映射,數據和查詢:
PUT /so
{
"settings": {
"analysis": {
"analyzer": {
"suggestion_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"analyzer_shingle": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"filter_shingle"
]
}
},
"filter": {
"filter_shingle": {
"type": "shingle",
"min_shingle_size": 4,
"max_shingle_size": 16,
"output_unigrams": "false"
}
}
}
},
"mappings": {
"d": {
"properties": {
"text": {
"properties": {
"english": {
"type": "string",
"fields": {
"shingles": {
"type": "string",
"analyzer": "analyzer_shingle"
},
"suggest": {
"type": "completion",
"index_analyzer": "analyzer_shingle",
"search_analyzer": "analyzer_shingle",
"payloads": true
}
}
}
}
}
}
}
}
}
文獻1:
POST /so/d/1
{
"text": {
"english": "The quick fox jumps over the big wall. JJKJKJKJ"
}
}
文獻2:
POST /so/d/2
{
"text": {
"english": "The quick fox jumps over the small wall. JJKJKJKJ"
}
}
文獻3:
POST /so/d/3
{
"text": {
"english": "The quick fox jumps over the gugus wall. LLLLLLL"
}
}
查詢:
POST /so/_search
{
"size": 0,
"query": {
"match": {
"text.english": "The quick fox jumps over the wall"
}
},
"aggs" : {
"states" : {
"terms" : {
"field" : "text.english.shingles",
"size": 40
}
}
}
}
你想達到什麼目的?從這兩個樣本文件中,你能解釋什麼應該是理想的結果? –
好的,所以你想讓你的查詢匹配,但結果應該按照它們匹配的文本進行分組?對'text.english.raw'的簡單聚合應該做到這一點(其中'.raw'是一個'not_analyzed'子字段)。 –
的確如此,我想用完全匹配文本對結果進行分組。我有一個分析和每個文檔的原始副本。聚合如何工作?我找不到那樣做。 –