簡體   English   中英

PHP彈性搜索全文搜索-按相關性排序

[英]PHP Elastic Search Full Text Search - Sort by Relevance

我想使用Elastic Search中的“%LIKE%”條件來獲取“用戶”數據。

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"
        }
    }
}

實現您想要的一種方法是指定一個在搜索時使用的分析器(即standard ),這樣默認ngram分析器就不會對您的輸入進行分析。 這樣,你就只匹配ab令牌既不a也不b令牌。

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令牌,因為在搜索時不會進行ngram標記。

"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
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM