Solr Lucene XmlQueryParser Span不排除Exclude

时间:2016-05-12 15:25:41

标签: xml parsing solr lucene

如何在XmlQueryParser语法中获得此标准lucene查询?

headline:(new -york)

这是我到目前为止所拥有的:

{!xmlparser}
<SpanNot fieldName="headline">
  <Include>
    <SpanTerm>new</SpanTerm>
  </Include>
  <Exclude fieldName="headline">
    <SpanTerm>york</SpanTerm>
  </Exclude>
</SpanNot>

我最初没有包括fieldName =&#34;标题&#34;对于Exclude节点,但是当我不断得到&#34; york&#34;在头条新闻中。

以下是一些结果:

{"id":243832340000000092, "headline":"New look pour New York"},
{"id":243661152000000019, "headline":"New York/New Market Project"},
{"id":243959040000000448, "headline":"New York Backs New Transmission Lines"}

这里是响应中的一些调试输出:

"rawquerystring":"{!xmlparser}\n<SpanNot fieldName=\"headline\">\n  <Include>\n\t<SpanTerm>new</SpanTerm>\n  </Include>\n  <Exclude fieldName=\"headline\">\n\t<SpanTerm>york</SpanTerm>\n  </Exclude>\n</SpanNot>",

"querystring":"{!xmlparser}\n<SpanNot fieldName=\"headline\">\n  <Include>\n\t<SpanTerm>new</SpanTerm>\n  </Include>\n  <Exclude fieldName=\"headline\">\n\t<SpanTerm>york</SpanTerm>\n  </Exclude>\n</SpanNot>",

"parsedquery":"SpanBoostQuery(spanNot(headline:new^1.0, headline:york^1.0, 0, 0)^1.0)",

"parsedquery_toString":"spanNot(headline:new^1.0, headline:york^1.0, 0, 0)^1.0",
        "QParser":"XmlQParser"

问题是为什么我在结果中纽约

1 个答案:

答案 0 :(得分:1)

您的查询正在查找包含“new”但不包含“york”的跨度(字段的某些片段)。简单地说“新”一词就足以提供这一点。通常,这将与SpanNear或类似的东西一起使用,这使它更有用。例如,如果您的Include,intead中的术语“new”和“term2”有一个SpanNear,则可以匹配“ new other stuff term2 york etc”,因为“york”的实例会掉落在包含中匹配的外部跨度,但“纽约term2”将不匹配,因为“york”属于SpanNear。

SpanNot实际上有constructor arguments您可以用来检查包含范围内的某个距离。我不确定xmlparser是否支持它(我不熟悉它),但如果是这样,我会想象这样的事情:

{!xmlparser}
<SpanNot fieldName="headline">
  <Include>
    <SpanTerm>new</SpanTerm>
  </Include>
  <Exclude fieldName="headline">
    <SpanTerm>york</SpanTerm>
  </Exclude>
  <Pre>0</Pre>
  <Post>1</Post>
</SpanNot>