【问题标题】:Search ElasticSearch field contained in a value搜索值中包含的 ElasticSearch 字段
【发布时间】:2016-05-25 16:21:01
【问题描述】:

我正在尝试在 ElasticSearch 中运行类似的字段查询:

select * from products where 'milk' like '%'+name+'%'

意思是我正在尝试查找在这种情况下产品名称是“牛奶”子字符串的所有文档。

我该怎么做?

【问题讨论】:

  • 请阅读the documentation
  • 我不确定它如何帮助我不需要:文本 LIKE "%quick%",我需要相反(见问题
  • 你能举例说明一下吗?类似于 3 个带有产品名称的文档:abcmilkman、abcman、a man 等。您希望前 2 个文档作为结果返回吗?如果是这样,那么sql查询似乎有点不对劲,我的意思是它不应该是select * from products where 'product_name' like '%'+milk+'%'吗?还是我都搞错了
  • @ArchitSaxena 这不是我需要的。例如如果我有一个产品名称为“bc”、“cd”和“def”的文档,并且查询是“abcde”,我想获取前两个文档,就像在 SQL select * from products where 'abcde' like '%' + product_name + '%'
  • 您能解释一下name'%'+name+'%' 中的含义吗?您是否以某种方式使用某种编程语言构建了这个 SQL 查询,并且将查询的不同部分连接在一起?因为+ 在 SQL 中不是有效的运算符。

标签: elasticsearch full-text-search substring


【解决方案1】:

我会使用利用 ngrams 的自定义分析器。首先创建一个这样的索引:

curl -XPUT 'localhost:9200/tests' -d '
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "ngrams"
                }
            },
            "tokenizer" : {
                "ngrams" : {
                    "type" : "nGram",
                    "min_gram" : "2",
                    "max_gram" : "10"
                }
            }
        }
    },
    "mappings": {
        "test": {
            "properties": {
                "product_name": {
                    "type": "string",
                    "analyzer": "standard",
                    "search_analyzer": "my_analyzer"
                }
            }
        }
    }
}'

然后你可以索引一些数据:

curl -XPOST 'localhost:9200/tests/test/_bulk' -d '
{"index":{}}
{"product_name": "bc"}
{"index":{}}
{"product_name": "cd"}
{"index":{}}
{"product_name": "def"}
'

最后你可以这样搜索:

curl -XPOST 'localhost:9200/tests/_search' -d '{
    "query": {
        "match": {
            "product_name": "abcde"
        }
    }
}'

您将获得前两个文档bccd

【讨论】:

  • 谢谢,这正是我想要的。
  • 太棒了,很高兴它有帮助!
  • @GuyKorland 你还需要什么?
猜你喜欢
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多