2016-06-09 108 views
0

我想在Elastic Search中使用「%LIKE%」條件獲取「用戶」數據。PHP彈性搜索全文搜索 - 排序方式相關度

GET user/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["firstname", "lastname"], 
      "query": "*a*" 
     } 
    }, 
    "sort": { 
     "_score": "desc" 
    } 
} 

它返回所有數據都帶有「_score」:1的結果。

名爲「Kunal Dethe」的數據是第一個,「Abhijit Pingale」是第二個。

但如預期的那樣,「Abhijit Pingale」應該首先出現,因爲字母「a」出現了兩次,而不是「Kunal Dethe」。

任何想法爲什麼?

編輯: 使用的「NGRAM」解決方案,但對於像「AB」一文中,該克被分解爲「a」,「B」,然後「AB」作爲「min_gram」被設置爲1因爲即使輸入單個字符也應返回結果。

但我希望搜索僅作爲「ab」完成。

當然,可以增加「min_gram」,但可以動態設置爲查找文本的長度嗎?實現你想要什麼的

POST /user 
{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "substring": { 
        "type": "nGram", 
        "min_gram": 1, 
        "max_gram": 15 
       } 
      }, 
      "analyzer": { 
       "substring_analyzer": { 
        "tokenizer": "standard", 
        "filter": [ 
         "lowercase", 
         "substring" 
        ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "user": { 
      "properties": { 
       "id": { 
        "type": "long" 
       }, 
       "firstname": { 
        "type": "string", 
        "analyzer": "substring_analyzer" 
       }, 
       "lastname": { 
        "type": "string", 
        "analyzer": "substring_analyzer" 
       } 
      } 
     } 
    } 
} 

//Searching via 

GET user/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["firstname^2", "lastname"], 
      "query": "ab" 
     } 
    } 
} 
+0

當您使用通配符時,計分沒有意義。這就是爲什麼它這樣做。另外,使用前綴通配符會引起麻煩,因爲它必須逐字檢查倒排索引中的每一項。 – pickypg

+0

但我確實需要「\ * a \ *」之類的查詢來完成。有沒有其他方法可以實現這一點? –

+0

如果你想避免通配符,你需要一個涉及ngrams的解決方案。看到這個:http://stackoverflow.com/questions/34331249/elasticsearch-query-string-dont-search-by-word-part/34331544#34331544 – Val

回答

2

一種方法是指定一個分析儀使用(即standard)在搜索時讓你的輸入沒有得到由默認NGRAM分析儀分析。這樣你只能匹配ab令牌,也不能匹配ab令牌。

GET user/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["firstname^2", "lastname"], 
      "query": "ab", 
      "analyzer": "standard"  <--- add this 
     } 
    } 
} 

一個更好的辦法,但是,是設置"search_analyzer": "standard"在映射而不是使用在搜索時的NGRAM方法爲好,這是當只有指定"analyzer": "substring_analyzer"的情況。因此,如果您搜索ab,那麼您只會匹配ab令牌,因爲在搜索時它不會被記錄。

"mappings": { 
    "user": { 
     "properties": { 
      "id": { 
       "type": "long" 
      }, 
      "firstname": { 
       "type": "string", 
       "analyzer": "substring_analyzer", 
       "search_analyzer": "standard"  <-- add this 
      }, 
      "lastname": { 
       "type": "string", 
       "analyzer": "substring_analyzer", 
       "search_analyzer": "standard"  <-- add this 
      } 
     } 
    } 
} 
+0

運作良好。謝謝。應用「映射」解決方案。 –

+0

真棒,很高興它解決了! – Val

+0

我還需要一個幫助。當用「ab」搜索時,即用一個空格,我們可以用「ab」得到更高分的結果,然後用「空格」得到其他結果嗎? –