【问题标题】:How to perform substring search using elastic?如何使用弹性执行子字符串搜索?
【发布时间】:2018-10-08 17:25:20
【问题描述】:

我在弹性中有green elephant,我想匹配queries中的前两个cmets:green elephant is herewhite and green elephant

await self.upload_to_elastic('green elephant')

queries = ('green elephant is here',
           'white and green elephant',
           'white and green and gray elephant'
           'elephant green',
           'green is my elephant name',
           'green',
           'green elephants')

for query in queries:
    items = await service.search_by_phrase(query)

这个子串搜索的方法是什么?

【问题讨论】:

  • 这是实现我想要的唯一方法吗?如果弹性搜索中的项目仅包含 1 个单词,该怎么办(所以,不是 green elephant,而只是 greenelephant
  • 根据我的经验,ngrams 是最简单的为什么要做我认为你想做的事情。是的,ngrams 将满足 1 个单词的情况。

标签: elasticsearch


【解决方案1】:

如果您的查询是针对message 字段中的值,您可以使用regexp

{
    "query": {
        "regexp":{
            "message": {
                "value": ".*(green elephant).*"
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    您需要使用斜率为 0(这是默认值)的 phrase matching 以仅匹配正确顺序的连续术语。

    GET /_search
    {
        "query": {
            "match_phrase" : {
                "message" : "green elephant"
            }
        }
    }
    

    正则表达式查询方法在生产中是有效的,但在生产中是不可行的,因为正则表达式查询非常消耗资源。

    【讨论】:

    • 我已经有green elephant在elastic里面了,看看queries 的列表
    • 对不起,我误读了你的问题。您可以为您的案例使用正则表达式或 shingle(如 ngrams 但用于短语)
    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多