0

我有一个 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);
    

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

任何帮助表示赞赏!

4

2 回答 2

0

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

于 2012-11-07T23:39:55.107 回答
0

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

<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>
于 2012-11-08T14:28:06.050 回答