PHP弹性搜索全文搜索-按相关性排序
我想在弹性搜索中使用“%LIKE%”条件获取“User”数据PHP弹性搜索全文搜索-按相关性排序,php,elasticsearch,Php,elasticsearch,我想在弹性搜索中使用“%LIKE%”条件获取“User”数据 GET user/_search { "query": { "query_string": { "fields": ["firstname", "lastname"], "query": "*a*" } }, "sort": { "_score": "desc" } } 它返回所有数据都带有“_分数”:1的
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
当然可以。我还有几个小时才能赏金。这就是为什么我为另一个问题添加了一个单独的问题。