在elasticsearch中为URL字符串生成匹配项

时间:2015-10-22 13:12:12

标签: elasticsearch

我一直在尝试使用令牌化程序/令牌过滤器和分析器的正确组合来利用弹性搜索来匹配网址。

不幸的是,似乎我到目前为止采用的每种方法都错过了一两个边缘情况。我希望那里的某个人可以对以下内容有所了解:

如果我在elasticsearch中存储了以下值:

  1. http://www.example111.com
  2. http://www.example111.com/cats
  3. http://www.example111.com/cats?type=tabby
  4. http://www.example111.com/cats/dogs
  5. http://www.example111.com/dogs/cats
  6. http://www.example222.com/cats
  7. http://www.example222.com
  8. http://www.example222.com/cats/dogs
  9. http://www.example333.com/fish
  10. 我想知道我可以用什么查询生成以下搜索字符串和结果集组合(按相关性得分排序):

    这里表达的一般想法是,结果按照它们与输入的相似程度进行排序,一直到tld和scheme。当整个查询字符串不匹配或段不匹配时,将丢弃结果。

1 个答案:

答案 0 :(得分:1)

这个怎么样:

1)。存储网址时,网址数据是一个类似于以下内容的对象:

{
    "tld" : "http://www.example111.com",
    "path" : "/cats",
    "qs" : "?type=birman"
}

我认为您不希望对这些内容进行分析......但这可能需要更多思考。

2)。当您必须查询这些记录时,您将类似地解析URL查询。

3)。调整符合您要求的查询 - 所以:

  • tld必须完全匹配
  • 结果中的路径必须是查询网址中路径的子字符串 - 您可以使用查询时间分析器,它将为您提供查询网址中路径的所有可能前缀子字符串(例如:给定“/ cats /狗“,你想要”/“,”/ c“,”/ ca“,......,”/ cats / dogs“)虽然这看起来效率低下......也许你可以得到像”/“这样的作品,” / cats“,”/ cats / dogs“在创建查询时预先设置,这些只会代表查询中的其他子句
  • 完全匹配查询字符串?我不确定这里的全部要求是什么。

查询可能类似于(查询网址http://www.example111.com/cats/dogs?type=birman):

{
    "query" : {
        "bool" : {
            "must" : [
                {
                    "match" : {
                        "url.tld" : "http://www.example111.com"
                    }
                },
                {
                    "match" : {
                        "url.qs" : "?type=birman"
                    }
                }
            ]
            "should" : [
                {
                    "match" : {
                        "url.path" : {
                            "query" : "/",
                            "boost" : 1
                        }
                    }
                },
                {
                    "match" : {
                        "url.path" : {
                            "query" : "/cats",
                            "boost" : 2
                        }
                    }
                },
                {
                    "match" : {
                        "url.path" : {
                            "query" : "/cats/dogs",
                            "boost" : 3
                        }
                    }
                }
            ]
        }
    }
}

如果每条记录有多个网址,请查看嵌套对象和嵌套查询。

无论如何,所有这些只是一个可能的想法......这不是你可能希望的一个方便的快速查询。