PHP弹性搜索全文搜索 - 按相关性

时间:2016-06-09 15:51:04

标签: php elasticsearch

我想使用弹性搜索中的“%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"
        }
    }
}

1 个答案:

答案 0 :(得分:2)

实现目标的一种方法是在搜索时指定要使用的分析器(即ab),这样您的输入就不会被默认的ngram分析器分析。这样,您只会匹配a令牌,而不会匹配bGET user/_search { "query": { "query_string": { "fields": ["firstname^2", "lastname"], "query": "ab", "analyzer": "standard" <--- add this } } } 令牌。

"search_analyzer": "standard"

然而,更好的方法是在映射中设置"analyzer": "substring_analyzer",而不是在搜索时使用ngram方法,这只是在指定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 } } } } 令牌,因为在搜索时这不会是ngram&#39}。

malloc()