php - PHP Elasticsearch 全文搜索-按相关性排序

标签 php elasticsearch

我想使用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,因为即使当a时也应返回结果输入单个字符。

但是我只想将搜索作为“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 token ,而不匹配ab token 。

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 token ,因为在搜索时不会被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
            }
        }
    }
}

关于php - PHP Elasticsearch 全文搜索-按相关性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37730783/

相关文章:

php - 重新声明 file_get_html simple_html_dom.php

javascript - 如何在不使用 PHP exec 或 shell_exec 的情况下运行 CasperJS 脚本

php - 我的 RockMongo(MongoDB GUI)发生了什么事?

php - 当我知道 ci 中表的一半名称时如何删除表

php - 具有相对路径的 file_get_contents

elasticsearch - 使用filebeat、logstash和elasticsearch向kibana发送json格式日志?

elasticsearch - Elasticsearch Index Lifecycle Policy无法滚动的问题

elasticsearch - 日期范围查询Elasticsearch

django - 如何在Elasticsearch中同时搜索单数和复数形式的单词?

java - 用于 ElasticSearch 的 Spring Boot Micrometer 与 APM Java 代理