- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,我需要允许用户对文档执行全文搜索,并使用 Lucene Query Parser syntax如果需要的话。 eXist 数据库是从使用 eulexistdb 的 Django 后端查询的。与 eXist 交谈。
问题在于,当用户使用不正确的语法进行全文搜索时,我们会在游戏后期才发现这一点。 Django 应用程序必须查询 SQL 数据库以确定搜索的某些参数。当构建完整的 XQuery 并访问 eXist 时,SQL 查询已经运行,这意味着 SQL 查询的成本已经花费了。 (我知道我可以将 SQL 端查询的数据编码到 eXist 中,以便只查询 eXist。目前这不是一个选项。)
我想提前知道 Lucene 查询是否存在语法错误,这样我就可以避免开始毫无意义地查询 SQL 数据库。
我已经检查了 eXist 的文档,但我没有在 API 中找到任何内容,这将是一个检查全文查询在语法上是否有效的简单函数。
最佳答案
这是一个简单的函数,它将返回 True
如果 Lucene 查询没问题,或者 False
如果查询中存在语法错误。 db
必须是 eulexistdb.db.ExistDB
的实例和query
是 Lucene 查询:
def check(db, query):
try:
db.query(safe_interpolate("ft:query(<doc/>, {lucene_query})",
lucene_query=query))
except ExistDBException as ex:
if ex.message().startswith(
"exerr:ERROR Syntax error in Lucene query string"):
return False
raise ex # Don't swallow other problems that may occur.
return True
这应该适用于任何有提供对 eXist 访问的库的语言。这个想法是针对虚假文档( <doc/>
)运行感兴趣的查询。使用伪造文档可以避免实际搜索数据库。 (空节点序列可能看起来更好,但我们不会针对空节点序列运行 ft:query
,因为这样 XQuery 优化器可以跳过尝试解析和运行 Lucene 查询,因为对空序列的有效查询必然会返回空序列,无论实际的 Lucene 查询如何。)它是否返回任何结果并不重要。如果查询没有错误,那么就不会出现异常。如果查询有语法错误,则会引发异常。我还没有找到比检查异常存储的错误消息来检测它是 Lucene 语法错误还是其他错误更可靠的方法。
(safe_interpolate
函数应该对 lucene_query
进行插值以避免注入(inject)。您可以决定应用程序中需要什么。)
关于lucene - 在启动我想要运行的完整 XQuery 之前,如何验证嵌入在较大 XQuery 中的 Lucene 查询不包含语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37665244/
我正在通过 PHP 将 .csv 中的两行插入到表中。 我还会跟踪任何错误,如果发生错误,我不会提交事务。插入表后,我检索结果行的 ID(全部在一个事务中提交),并且 csv 的第一行对应于第二个 I
一个应用程序托管一个具有三个接口(interface)的 Web 服务,用于三个单独且独立的操作,所有这些操作都在应用程序的不同组件中实现,彼此独立,例如在不同的包等中,所以他们对彼此了解不多,只共享
我希望在单击特定表格数据单元格时同时选中单选按钮和单选按钮单击事件。我已经使用以下方法实现了这一点: $(document).ready(function() { $("td").click(
JSFiddle:https://jsfiddle.net/oyp1zxaq/ 本质上,我只是想在较大的 div 中放置四个具有定义宽度的较小 div,但我希望它们在其中间隔开。 我想知道是否有一种方
我在一个布局中有两个 View 。我将分别称它们为 View A 和 View B。 ┌──────┐ │┌─┐┌─┐│ ││A││B││ │└─┘└─┘│ └──────┘ 父布局(包括View A
我是一名优秀的程序员,十分优秀!