elasticsearch 基于弹性搜索的双向匹配
我已经为术语列表编制了索引,现在我想查询其中的一些术语 假设我为“狗粮”、“红狗”、“狗”、“食物”、“猫”编制了索引 如何创建精确的双向匹配查询。ie:我想在搜索“dog”时只搜索术语
elasticsearch 基于弹性搜索的双向匹配,
elasticsearch,solr,lucene,nosql,
elasticsearch,Solr,Lucene,Nosql,我已经为术语列表编制了索引,现在我想查询其中的一些术语 假设我为“狗粮”、“红狗”、“狗”、“食物”、“猫”编制了索引 如何创建精确的双向匹配查询。ie:我想在搜索“dog”时只搜索术语dog,而不是其他术语(因为它们不匹配) 我想到的一个原始解决方案是用术语的长度(单词)索引术语然后,在搜索长度为X的查询时,将其限制为长度为X的项。但这似乎过于复杂。只需将字段的索引属性设置为未分析,您的查询应使用项过滤器来搜索文本 根据Evaldas的建议,在下面找到一个更完整的解决方案,该解决方案还使用标
dog
,而不是其他术语(因为它们不匹配)
我想到的一个原始解决方案是用术语的长度(单词)索引术语然后,在搜索长度为X的查询时,将其限制为长度为X的项。但这似乎过于复杂。只需将字段的
索引属性设置为未分析
,您的查询应使用项过滤器来搜索文本
根据Evaldas的建议,在下面找到一个更完整的解决方案,该解决方案还使用标准analyzer对原始值进行索引,但使用带有小写版本的术语的子字段:
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_keyword_lowercase_analyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"tokenizer": "keyword"
}
}
}
},
"mappings": {
"asset": {
"properties": {
"name": {
"type": "string",
"fields": {
"case_ignore": {
"type": "string",
"analyzer": "my_keyword_lowercase_analyzer"
}
}
}
}
}
}
}
POST /test/asset/1
{
"name":"dog"
}
POST /test/asset/2
{
"name":"dog food"
}
POST /test/asset/3
{
"name":"red dog"
}
GET /test/asset/_search
{
"query": {
"match": {
"name.case_ignore": "Dog"
}
}
}
创建一个自定义分析器,使搜索词小写并规范化。这就是你的索引:
{
"settings" : {
"analysis" : {
"analyzer" : {
"my_analyzer_keyword" : {
"type" : "custom",
"tokenizer" : "keyword",
"filter" : [
"asciifolding",
"lowercase"
]
}
}
}
},
"mappings" : {
"your_type" : {
"properties" : {
"name" : {
"type" : "string",
"analyzer" : "my_analyzer_keyword"
}
}
}
}
}
因此,如果您索引了“dog”
,并且用户在dog
或dog
或dog
中键入了内容,则它将只匹配dog
,不会带回“狗粮”
。不会这样做。以大写字母为例。@EvaldasBuinauskas我在OP中没有看到任何大写字母;-)。商店方面是的。但用户可以键入任何内容!:)