我正在尝试为最终用户提供搜索类型,这更像sqlserver。我能够为给定的SQL场景实现ES查询:
select * from table where name like '%pete%' and type != 'xyz and type!='abc'
但是ES查询不适用于此sql查询
select * from table where name like '%peter tom%' and type != 'xyz and type!='abc'
在我的elasticsearch以及通配符查询中,我还需要执行一些布尔过滤查询
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{
"query": {
"wildcard": {
"name":
{ "value": "*pete*" }
}
}
}
],
"must_not": [
{
"match":
{ "type": "xyz" }
}, {
"match":
{ "type": "abc" }
}
]
}
}
}
}
}
上面的带有通配符搜索的弹性查询可以很好地工作,并让我获得所有与pete匹配且不是xyz和abc类型的文档。但是当我尝试使用以空格分隔的2个独立单词执行通配符时,相同的查询返回我为空,如图所示下面。例如
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{
"query": {
"wildcard": {
"name":
{ "value": "*peter tom*" }
}
}
}
],
"must_not": [
{
"match":
{ "type": "xyz" }
}, {
"match":
{ "type": "abc" }
}
]
}
}
}
}
}
我的映射如下:
{
"properties": {
"name": {
"type": "string"
}
"type": {
"type": "string"
}
}
}
我应该使用什么查询才能对以空格分隔的单词进行通配符搜索
最有效的解决方案涉及利用ngram标记器来标记name
字段的某些部分。例如,如果您有一个名称,如petertomson
,则ngram令牌生成器将对它进行令牌化和索引,如下所示:
因此,将其编入索引后,搜索这些标记中的任何一个都会peter thomson
在其中检索您的文档。
让我们创建索引:
PUT likequery
{
"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"
}
}
}
}
}
然后,您将可以通过一个简单且非常有效的term
查询进行如下搜索:
POST likequery/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"name.search": "peter tom"
}
}
],
"must_not": [
{
"match": {
"type": "xyz"
}
},
{
"match": {
"type": "abc"
}
}
]
}
}
}
我正在使用ElasticSearch5,找不到以下问题的解决方案:我想在文档中搜索带斜杠的字符串(url的一部分)。但它不会返回匹配的文档。我读过一些东西,带斜线的字符串被ES拆分,这不是我想要的字段。我尝试用映射在字段上设置“not_analysis”,但似乎无法使其工作。 “创建索引”:Put http://localhost:9200/test “添加文档”:post http://loca
问题内容: 使用GAE搜索API是否可以搜索部分匹配项? 我正在尝试创建自动完成功能,其中该术语将是部分单词。例如。 b bui 构建 都将返回“建筑物”。 GAE怎么可能? 问题答案: 尽管全文搜索不支持LIKE语句(部分匹配),但是您可以修改它。 首先,为所有可能的子字符串标记数据字符串(hello = h,he,hel,lo等) 使用标记化的字符串构建索引+文档(搜索API) 执行搜索,然后
我有一个带有标准分析器的弹性搜索集群。我知道使用这个分析仪,术语“300”被分析为一种类型。 假设我正在搜索一个具有字段“name”的文档,该字段的值为“纸巾300 CT”,分析为[“Paper”(ALPHANUM)、“tower”(ALPHANUM)、“300”(NUM)、“CT”(ALPHANUM)] 目前,当我使用模糊/通配符查询时,如下所示: 无论模糊性如何调整,模糊查询都不匹配。我希望术
问题内容: 我正在寻找给定此数组的函数, 我想寻找针头 “面包” 并得到以下结果 问题答案: 使用。您可以提供一个回调,该回调确定哪些元素保留在数组中以及哪些元素应删除。(从回调返回的值指示应删除给定的元素。)类似这样的东西: 欲获得更多信息: 返回值
背景资料 我正在开发一个API,允许用户传递关于成员的详细信息列表(姓名,电子邮件地址,...)我想使用这些信息与我的Elasticsearch数据库中的帐户记录进行匹配,并返回潜在匹配的列表。 我以为这将是简单的做一个bool查询领域我想要的,但是我似乎没有得到任何点击。 我对Elasticsearch比较陌生,我当前的搜索请求如下所示。 查询示例 POST/member/account/\u搜
问题内容: 我需要创建电话簿之类的东西。它包含名称和号码。现在,当我键入字母时,应该返回匹配列表。对于下面给出的示例,当我键入H时,应返回包含Harmer,Harris,Hawken,Hosler的列表。当输入Ha时,仅返回Harmer,Harris,Hawken的列表。 知道如何实现吗?提前致谢。 问题答案: 是的,为此,HashMap不是正确的数据结构。正如博佐所说,特里(Trie)是正确的选