2015-10-22 21 views
1

我一直在想出令牌处理器/令牌过滤器和分析器的正确组合,以利用elasticsearch来匹配URL。在elasticsearch中为URL字符串生成匹配

不幸的是,似乎我所采取的每种方法都未能找到一个或两个边缘案例。我希望有人在那里或许可以揭示一些轻如下:

如果我已经存储在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

我想知道我可以使用什么样的查询生成以下搜索字符串和结果集组合(依相关程度排序):

这里表达的总体思路是,结果按照与输入的相似程度排序,直到tld和scheme。当查询字符串不匹配或段不匹配时,结果将被丢弃。

+1

根据该查询示例111/dogs应返回example111.com/dogs/cats,但查询example222.com/cats不应返回example222.com/cats/dogs。我认为http://www.example111.com/dogs [5,1]的例子似乎与其他的不一致。 – eemp

+0

啊,是的,谢谢!修订。 –

+0

只是想知道你是否看过这个? http://stackoverflow.com/questions/18977834/indexing-website-url-in-elastic-search这似乎很有用。 –

回答

1

这个怎么样:

1)。当你存储的URL,URL数据是一个对象,看起来像:

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

我不认为你需要这些来进行分析......但是,很可能需要更多的思考。 2)。当你必须查询这些记录时,你将类似地解析url查询。 3)。编造适合您需求的查询 - 所以:

  • TLD必须在结果完全
  • 相符的路径必须在查询URL路径的一个子 - 您可以使用查询时,分析仪,这将使你的所有(例如:给定“/ cats/dogs”,你想要“/”,“/ 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 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

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

无论如何,这一切只是一个可能的想法...这不是一个简单的快速查询,你可能一直希望。

+0

如果存在查询字符串,则可能需要整个URL 100%匹配。所以我不担心这个,我只是提交一个确切的字符串搜索。 –