【问题标题】:Solr Lucene XmlQueryParser SpanNot not excluding ExcludeSolr Lucene XmlQueryParser SpanNot 不排除 Exclude
【发布时间】:2016-05-12 15:25:40
【问题描述】:

如何在 XmlQueryParser 语法中获得这个标准的 lucene 查询?

headline:(new -york)

这是我目前所拥有的:

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

我最初没有为 Exclude 节点添加 fieldName="headline",但是当我在标题中不断出现“york”时我添加了它。

以下是一些正在通过的结果:

{"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"

问题是为什么我的结果中出现纽约

【问题讨论】:

    标签: xml parsing solr lucene


    【解决方案1】:

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

    【讨论】:

    • 好吧,你是说 SpanNot 的工作是找到一个包含世界上任何东西的跨度 (疯狂的大或疯狂的简单),但排除任何 匹配?如果是这样,我想我开始明白了。我会使用什么 SpanQuery 来排除任何与“york”匹配的文档?
    • 我的目标:查找包含“new”一词的文档,排除包含“york”一词的文档。
    • @Brandon - 如果你只想找到任何匹配“新”而不是“约克”的东西,我根本不会使用 SpanQuery。像这样的查询:headline:(new -york) 会这样做。使用 xmlparser,您可以使用 BooleanQuery,参见 example here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多