2016-08-12 76 views
0

我的用例: 我有一个名为cqpath的单值字段。这是一个文本框,并具有价值,看起来像下面这样:如何查询子字符串的solr字段

  1. “/内容/域/ EN /路径/到/一些/页”
  2. “/内容/域/ EN /路/到/其它/页”
  3. “/内容/域/ EN-US /路径/到/一些/页”
  4. “/内容/域/ EN-US /路径/到/其它/页”

我想形成一个查询,将返回我1.和2.我一直在努力沿着写作的路线:

cqpath:“/ content/domain/en”

已被发现是错误的,因为它也检索项目3和4。你们有没有想过一种方法来编写一个只返回1和2而不是3和4的查询?

这是一个普通的textfield字段类型。真的很感激你的帮助。

+0

你在使用[StandardTokenizer](https://cwiki.apache.org/confluence/display/solr/Tokenizers#Tokenizers-StandardTokenizer)吗?你能把你的'schema.xml'发布到什么地方吗? – rivu

+0

您可以将它复制到常规的StrField并使用'field:/ content/domain/en/*'查询吗? – MatsLindh

回答

0

从Solr 4.0开始,您可以使用正则表达式查询。你可以找到一些有用的例子here。 在你的情况,你可以得到你正在寻找使用类似的结果:

cqpath:/.*content/domain/en.*/ 
+0

我刚刚尝试过,它似乎不工作。出于某种原因,标准标记器似乎丢掉了作为问题根源的破折号( - )和斜线(/)。感谢您花时间回答反正...我的目标是乱搞tokenizer .. –

0

它看起来像你正试图与路径元素(斜杠)边界位置匹配部分路径。通常的通用解决方案是在索引期间标记化以生成所有替代完成,并且在查询期间标记化为而不是。所以,字段类型声明是不对称的。 Solr发行版中有这样的例子。你会看看使用像(仅索引时间)EdgeNGramFilterFactory,而不是更昂贵的正则表达式匹配。

对于您的具体情况,您可能需要查看测试PathHierarchyTokenizer,它会自动为您执行此操作。

如果您的内容更像完整的网址而不仅仅是路径,您还可以通过包含URLClassify URP的自定义更新请求处理器链感兴趣。这不是很有文件记载,但提到generating url parts,这是我认为你会想要的。

+0

PathHierarchyTokenizer是答案...谢谢陌生人(reddit gold):) –