elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

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

PHP弹性搜索全文搜索-按相关性排序,php,elasticsearch,Php,elasticsearch,我想在弹性搜索中使用“%LIKE%”条件获取“User”数据 GET user/_search { "query": { "query_string": { "fields": ["firstname", "lastname"], "query": "*a*" } }, "sort": { "_score": "desc" } } 它返回所有数据都带有“_分数”:1的

我想在弹性搜索中使用“%LIKE%”条件获取“User”数据

GET user/_search
{
    "query": {
        "query_string": {
            "fields": ["firstname", "lastname"],
            "query": "*a*"
        }
    },
    "sort": {
        "_score": "desc"
    }
}
它返回所有数据都带有“_分数”:1的结果

第一个数据名为“Kunal Dethe”,第二个数据名为“Abhijit Pingale”

但正如所料,“Abhijit Pingale”应该排在第一位,因为字母“a”在这个名字中出现了两次,而不是在“Kunal Dethe”中

你知道为什么吗

编辑: 使用“nGram”解决方案,但对于像“ab”这样的文本,g被分解为“a”,“b”,然后“ab”作为“min_gram”被设置为1,因为即使输入单个字符,结果也应该返回

但我希望搜索只作为“ab”进行

当然,可以增加“最小值”,但可以动态设置为搜索文本的长度吗

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

实现所需功能的一种方法是在搜索时指定要使用的分析器(即
标准
),这样您的输入就不会被默认的ngram分析器分析。这样,您将只匹配
ab
标记,而既不匹配
a
也不匹配
b
标记

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

实现所需功能的一种方法是在搜索时指定要使用的分析器(即
标准
),这样您的输入就不会被默认的ngram分析器分析。这样,您将只匹配
ab
标记,而既不匹配
a
也不匹配
b
标记

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

使用通配符时,评分没有意义。这就是它这么做的原因。另外,使用前缀通配符也会带来麻烦,因为它必须检查倒排索引中的每个词。但我确实需要完成类似“*a*”的查询。有没有其他方法来实现这一点?如果你想避免通配符,你需要一个涉及ngrams的解决方案。看到这一点:可以使用nGrams,但当搜索为“*Kunal Dethe*”时,我希望它搜索为“%Kunal Dethe%”,这是全文,但不会将单词拆分为克。必须根据要求使用1实现“min_gram”。但我需要给“firstname”字段一个提升/优先选择,当你使用通配符时,评分是没有意义的。这就是它这么做的原因。另外,使用前缀通配符也会带来麻烦,因为它必须检查倒排索引中的每个词。但我确实需要完成类似“*a*”的查询。有没有其他方法来实现这一点?如果你想避免通配符,你需要一个涉及ngrams的解决方案。看到这一点:可以使用nGrams,但当搜索为“*Kunal Dethe*”时,我希望它搜索为“%Kunal Dethe%”,这是全文,但不会将单词拆分为克。必须根据要求使用1实现“min_gram”。但我需要优先考虑“firstname”字段,这很有效。非常感谢。应用了“映射”解决方案。我还需要一件事的帮助。。当使用“ab”搜索时,即使用空格搜索时,我们是否可以获得“ab”得分较高的结果,然后获得其他使用“空格”的结果?标准的标记器将在空格上拆分,因此您不会使用您的术语索引任何空格。如果您想在查询中包含空格,则需要使用ngram标记器而不是ngrams标记过滤器。我在此处添加了这个问题
http://stackoverflow.com/questions/37808547/php-elastic-search-filtered-query-string-search
当然可以。我还有几个小时才能赏金。这就是为什么我为另一个问题添加了一个单独的问题。这很有效。非常感谢。应用了“映射”解决方案。我还需要一件事的帮助。。当使用“ab”搜索时,即使用空格搜索时,我们是否可以获得“ab”得分较高的结果,然后获得其他使用“空格”的结果?标准的标记器将在空格上拆分,因此您不会使用您的术语索引任何空格。如果您想在查询中包含空格,则需要使用ngram标记器而不是ngrams标记过滤器。我在此处添加了这个问题
http://stackoverflow.com/questions/37808547/php-elastic-search-filtered-query-string-search
当然可以。我还有几个小时才能赏金。这就是为什么我为另一个问题添加了一个单独的问题。