【问题标题】:Lucene.net query for contains and avoiding empty string fieldsLucene.net 查询包含并避免空字符串字段
【发布时间】:2022-04-03 10:51:15
【问题描述】:

我有一个 Lucene 索引设置,我可以很好地查询。我只是无法让“字段不等于空字符串”条件起作用。例如在下面的代码示例中,我想要 3 个条件

  1. 其中“国家标签”字段包含“{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}”。
  2. 其中“国家标签”字段不是空字符串。
  3. 其中“日期”范围介于“20110101T000000”和“20121001T000000”之间。

        WildcardQuery taggingQuery = new WildcardQuery(new Term("country tag", "*" + ShortID.Encode("{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}").ToLowerInvariant() + "*"));
        TermQuery taggingNotQuery = new Term("country tag", " "));
    
        RangeQuery rangeQuery = new RangeQuery(new Term("date", "20110101T000000"), new Term("date", "20121001T000000"), true);
    
        BooleanQuery booleanQuery = new BooleanQuery();
        booleanQuery.Add(taggingQuery, BooleanClause.Occur.MUST);
        booleanQuery.Add(taggingNotQuery, BooleanClause.Occur.MUST_NOT);
        booleanQuery.Add(rangeQuery, BooleanClause.Occur.MUST);
    

我感觉我做错了,或者我的查询在某种程度上是错误的。我不应该需要一个我应该注意空字段或空字段的条件。

感谢任何帮助!

【问题讨论】:

  • 你能展示你用来将文档写入没有国家的索引的代码吗?
  • 您是否在文档中多次添加国家标签字段?如果不是,那么您不需要 MUST_NOT 子句。顺便说一句,您的 MUST_NOT 检查空格,而不是空字符串。最后,根据您所说,我建议您不要添加带有空字符串的字段,只是不要将该字段添加到您的文档中。

标签: lucene.net


【解决方案1】:

如果您允许 '*' 作为搜索字符串中的第一个字符,Lucene 可以使用“countrytag:*”之类的查询来查找包含 countrytag 字段中的任何内容的所有文档。 (Lucene 的默认设置是禁用查询字符串中的初始 '*'。)

【讨论】:

  • 我尝试使用 WildQuery query = new WildQuery("country tag", "[GUID]");但它没有用。此查询与其他范围和术语查询一起添加到布尔查询中。此外,我尝试 QueryParser 允许领先的明星,但这也不起作用。国家标签字段由 StandardAnalyzer 分析,它是一串 GUID 值。分析后添加为“ASDF342SDFAS 2342LJLJl”,中间有空格。请注意,GUID 只是示例。实际值是不带连字符和花括号的真正 GUID。我只是无法让这件事发挥作用,而且我现在已经束手无策了。
  • 另外,我尝试搜索的值将转换为分析的字段格式,例如 23LKLL233。
【解决方案2】:

我应该在设置索引时多加注意。我忘了为每个字段添加字段分析器。使用不同的分析器而不是标准分析器对多列表字段进行索引。我将此添加到我的配置部分以进行字段抓取,并且我的查询开始工作

<fieldTypes hint="raw:AddFieldTypes">
                  <!-- Text fields need to be tokenized -->
                  <fieldType name="single-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="multi-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="word document" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="html" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <!-- Multilist based fields need to be tokenized to support search of multiple values -->
                  <fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <!-- Legacy tree list field from ver. 5.3 -->
                  <fieldType name="tree list" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                </fieldTypes>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2017-01-01
    • 2015-01-01
    • 2018-10-27
    • 1970-01-01
    • 2011-02-05
    • 2013-06-04
    • 2022-11-30
    相关资源
    最近更新 更多