当前位置: 首页 > 面试题库 >

用于elasticsearch中的通配符搜索的ngram

唐兴思
2023-03-14
问题内容

我正在尝试为最终用户提供搜索类型,这更像sqlserver。我能够为给定的SQL场景实现ES查询:

 select * from table where name like '%peter tom%' and type != 'xyz

在ES中,我使用ngram tokenizer来达到预期的结果:

PUT sample
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "tokenizer": "my_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "nGram",
          "min_gram": "2",
          "max_gram": "15"
        }
      }
    }
  },
  "mappings": {
    "typename": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "search": {
              "type": "string",
              "analyzer": "my_ngram_analyzer"
            }
          }
        },
        "type": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "name.search": "peter tom"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "type": "xyz"
          }
        },
        {
          "match": {
            "type": "abc"
          }
        }
      ]
    }
  }
}

所以,如果我的文档行像

name                              type
peter tomson                      efg
Peter tomson robert simson        efg

上面的查询只显示了两个文档,但是当我尝试输入Peter sims或Peter simson时,除非我输入Peter tomson robert
sims或Peter tomson robert
simson,否则它不会返回第二个文档。所以基本上我必须键入以下所有内容在彼得之后和西姆森之前的单词,到达第二个文档。有什么办法可以使第二个文档具有部分匹配。我可以使用查询匹配和“
AND”操作,但是仍然与单词完全匹配。我正在寻找部分匹配,例如Peter sims应该给我第二行文件。谢谢


问题答案:

我自己发布了解决方案供其他用户参考,从而找到了查询的答案:

{
    "settings": {
        "analysis": {
            "analyzer": {
                "autocomplete": {
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "autocomplete"
                    ]
                },
                "autocomplete_search": {
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase"
                    ]
                }
            },
            "filter": {
                "autocomplete": {
                    "type": "nGram",
                    "min_gram": 2,
                    "max_gram": 40
                }
            }
        }
    },
    "mappings": {
        "doc": {
            "properties": {
                "title": {
                    "type": "string",
                    "analyzer": "autocomplete",
                    "search_analyzer": "autocomplete_search"
                }
            }
        }
    }
}

PUT my_index/doc/1
{
  "title": "peter tomson" 
}

PUT my_index/doc/2
{
  "title": "Peter tomson robert simson" 
}


GET my_index/doc/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "Pete sim", 
            "operator": "and"
          }
        }
      }
    }


 类似资料:
  • 问题内容: 我已经使用此批量请求设法用4个文档填充了索引: 开机自检 现在如何在所有可用 标题* 上使用 通配符 进行 搜索 ? *** 类似于 但提供一个或多个通配符的东西。例如,搜索“ ”并解析来自elasticsearch的响应以最终返回如下内容: 谢谢! 问题答案: Elasticsearch在常规匹配查询中提供正则表达式支持 给你这个 要更新到您的问题URI搜索,我不确定是否可行,如果使

  • 问题内容: 我目前正在使用Tire Client进行elasticsearch。可以说我有一个字段,该字段在我的elasticsearch映射中被索引为很长的类型的字段。我正在尝试实现以下目标: “ id”是我一直在谈论的领域。但是由于我在查询中指定了字段,所以通配符不起作用,最终我得到了唯一匹配的结果。 但是对_all搜索也可以执行相同的操作,因为字段类型无关紧要。我希望此通配符搜索有效,同时还

  • 问题内容: 可以说我有一个清单 如何让用户进行通配符搜索? 搜索词:“ th_s” 将返回“ this” 问题答案: 正则表达式可能是解决此问题的最简单方法:

  • 问题内容: 我正在使用我的应用程序中的单个传输客户端实例在Elasticsearch中查询多个并行请求。 对于并行执行,我得到了以下异常。如何克服这个问题。 问题答案: Elasticsearch有一个线程池和一个用于每个节点搜索的队列。线程池将具有N个准备就绪的工作者来处理请求。当请求到来且工作人员空闲时,由工作人员处理。现在默认情况下,工作程序数量等于该CPU上的内核数量。当工作人员忙碌并且有

  • 本文向大家介绍solr 通配符搜索,包括了solr 通配符搜索的使用技巧和注意事项,需要的朋友参考一下 示例 name:john* *指示符允许您在搜索词john之后进行匹配0个或多个字符的通配符搜索,将返回包含john,johnson,john's,johnny等的文档。 name:do? ?指示符允许您在搜索项中使用单个字符进行通配符搜索,将返回包含doe,dog,dot等的文档。

  • 我想在一个字段上使用通配符搜索,这个字段是一个长值(在实体类中)和数据库中的整数。这里联系的是实体类,它的字段:Id在实体类中是长值,在数据库中是整数。下面是代码。 但是我得到查询语法异常,它不能转换成完美的语法。当我查看日志时,它给出的查询类似于->(cast(GeneratedAlias0.id as varchar(255)),但不是as(cast(GeneratedAlias0.id as