我有一個包含用戶名的彈性欄位,例如。我的名字將包含vojtech knyttl.
我正在嘗試創建一個匹配查詢,以便能夠通過以下短語找到我的名字:
vojtech kvojtech knyknyttl
我的查詢:
{
"bool" : {
"should" : [
{
"match" : {
"keywords" : {
"query" : "vojtech kn",
"operator" : "AND",
"prefix_length" : 0,
"max_expansions" : 50,
"minimum_should_match" : "50%",
}
}
}
]
}
}
問題是,由于運營商的原因,vojtech并vojtech kn不會找到任何東西。AND如果我切換到OR,搜索vojtech knyttl實際上會選擇vojtech資料庫中的每一個,我的姓氏甚至不會出現在最上面的結果中。
這種搜索應該如何形成查詢?
uj5u.com熱心網友回復:
您應該使用匹配短語前綴查詢,在下面的示例中對其進行了測驗,并且根據您的用例似乎可以正常作業。
樣本檔案
{
"name" : "vojtech knyttl"
}
{
"name" : "vojtech"
}
{
"name" : "vojtech kn"
}
使用匹配詞組前綴搜索查詢
{
"query": {
"match_phrase_prefix": {
"name": {
"query": "vojtech k"
}
}
}
}
uj5u.com熱心網友回復:
我認為 edge_ngrams 應該在這種情況下作業。請嘗試以下方法:
設定索引以使用 edge_ngrams 作為索引分析器。
PUT test
{
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "custom_analyzer",
"search_analyzer": "standard"
}
}
},
"settings": {
"analysis": {
"filter": {
"custom_edge_ngram":
{
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10
}
},
"analyzer": {
"custom_analyzer":{
"tokenizer":"standard",
"filter":[
"lowercase",
"custom_edge_ngram"]
}
}
}
}
}
然后使用以下查詢查詢索引:
GET test/_search
{
"query": {
"match": {
"name":
{
"query":"vojtech k",
"operator": "and"
}
}
}
}
說明:
邊緣 ngram 索引分析器將為索引中的 name 欄位生成最小長度為 1 且最大為 10 的 ngram
您可以使用以下方法檢查令牌:
GET test/_analyze
{
"analyzer": "custom_analyzer",
"text": ["vojtech knyttl"]
}
當您使用匹配查詢進行搜索時,它會在您的檔案中找到 vojtech 和 k 作為 ngram。
我的測驗用例 vojtech adams、vojtech knyttl、vojtech、joe knyttl
如果我搜索 vojtech knyttl,它會回傳 1 個結果。
如果我搜索 vojtech,我會得到 vojtech adams、vojtech knyttl、vojtech
如果我搜索 vojteck k 我會得到 vojtech knyttl
如果我搜索 knyttl,我會得到 vojtech knyttl,joe knyttl
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481746.html
標籤:弹性搜索
