当前位置: 首页 > 知识库问答 >
问题:

lucene查询一个字段模糊,另一个字段精确

张献
2023-03-14

问题:

我已经在lucene索引中索引了NGA Geonames地名录。我需要模糊查询一个字段(地名),但将查询限制为具有特定国家代码的记录。下面是我正在运行的一个示例查询
我没有使用SOLR,我已经做了大量的研究和尝试,但我没有明确的答案,可能是我的速度太慢了。

FULL_NAME_ND_RO:india AND CC1:in 

我想对印度进行模糊搜索,但我只想要与“in”(国家代码)完全匹配的记录

Here is what I've tried:
1. Index every field as a textfield and boost the country code field using ^N. Still returns different country codes, and the one boosted does not always come first...
2. Index every field as text EXCEPT the country code, which I indexed as StringField. This way I get no results at all.
public void index(File outputIndexDir, File gazateerInputData, GazType type) throws Exception {
    if (!outputIndexDir.isDirectory()) {
      throw new IllegalArgumentException("outputIndexDir must be a directory.");
    }

    String indexloc = outputIndexDir + type.toString();
    Directory index = new MMapDirectory(new File(indexloc));

    Analyzer a = new StandardAnalyzer(Version.LUCENE_45);
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_45, a);

    IndexWriter w = new IndexWriter(index, config);

    readFile(gazateerInputData, w, type);
    w.commit();
    w.close();

  }

  public void readFile(File gazateerInputData, IndexWriter w, GazType type) throws Exception {
    BufferedReader reader = new BufferedReader(new FileReader(gazateerInputData));
    List<String> fields = new ArrayList<String>();
    int counter = 0;
    // int langCodeIndex = 0;
    System.out.println("reading gazateer data from file...........");
    while (reader.read() != -1) {
      String line = reader.readLine();
      String[] values = line.split(type.getSeparator());
      if (counter == 0) {
        for (String columnName : values) {
          fields.add(columnName.replace("»¿", "").trim());
        }

      } else {
        Document doc = new Document();
        for (int i = 0; i < fields.size() - 1; i++) {
          if (fields.get(i).equals("CC1")) {
            doc.add(new StringField(fields.get(i), values[i], Field.Store.YES));
          } else {
            doc.add(new TextField(fields.get(i), values[i], Field.Store.YES));
          }
        }

        w.addDocument(doc);

      }
      counter++;
      if (counter % 10000 == 0) {
        w.commit();
        System.out.println(counter + " .........committed to index..............");
      }

    }
    w.commit();
    System.out.println("Completed indexing gaz! index name is: " + type.toString());
  }
QueryParser parser = new QueryParser(Version.LUCENE_45, luceneQueryString, geonamesAnalyzer);
  Query q = parser.parse(luceneQueryString);

  TopDocs search = geonamesSearcher.search(q, rowsReturned);

共有1个答案

岳卓君
2023-03-14

最简单的答案似乎是使用适当的查询语法运行模糊查询,例如:

 FULL_NAME_ND_RO:india~ AND CC1:in

但是,如果需要以不同的方式分析每个字段,可以使用PerFieldAnalyzerWrapper进行分析

根据以下评论意见:

StandardAnalyzer(Version.LUCENE_45, new CharArraySet(Version.LUCENE_45, 0, true));
Map<String,Analyzer> analyzerPerField = new HashMap<String,Analyzer>();
analyzerPerField.put("CC1", new KeywordAnalyzer());

PerFieldAnalyzerWrapper aWrapper =
  new PerFieldAnalyzerWrapper(geonamesAnalyzer, analyzerPerField);

QueryParser parser = new QueryParser(Version.LUCENE_45, defaultField, aWrapper);
 类似资料:
  • 问题内容: 如何查询或过滤一个字段不等于另一个字段?即,其中document1.city1.name不等于document1.city2.name。 这个的一些版本? http://www.elasticsearch.org/guide/zh- CN/elasticsearch/reference/current/search-request-script- fields.html 问题答案: 是

  • 我在编程一个订单提交页面时遇到了一个相当大的问题,该页面的目的是提交一个订单的争议--提供两个字段被填写,但只有当一个字段少于另一个字段时。 基本上,一个是下拉,另一个是争端框,查询如下: 如果DispotestExtBox=“”而下拉框=“请选择...” 一切正常-提交按钮已启用 如果DisportestExtBox!=“”而下拉框=“请选择...” 错误(反之亦然,因此如果填充了Dispone

  • 我有一个带有搜索功能的spring MVC应用程序。 虚拟查询生成器 现在,这个虚拟查询生成器不支持通配符或任何其他类型。我正在学习Apache Lucene Query API(还添加了Lucene Core-7.7.1来进行项目)和一大堆教授如何使用不同类型的查询实现(TermQuery、PhraseQuery、BooleanQuery等)的文章,但这根本没有意义。最后,我仍然手动构建查询。

  • 我开始使用验证框架用jax-rs验证json请求 是否可以根据另一个字段验证一个字段? 提前致谢

  • 我想使用Laravel雄辩的模型和关系来连接项目中所有表中的数据;然而,我在翻译这些关系时遇到了一个问题。例如,我有两张桌子;第一个是Books表,另一个是Author表。 如何在Books表上建立关系以获取和?

  • 问题内容: 我在想出可以验证JSON是否包含以下任一内容的JSON模式时遇到了麻烦: 仅一个字段 仅另一个领域 (其他两个字段之一) 但如果存在多个则不匹配。 具体来说,我要 和/或 进行验证,但我不想接受更多的验证。 这是到目前为止我得到的: 这比我想要的要匹配。我希望它符合以下所有条件: 但不符合: 我猜想我有明显的失踪-我想知道它是什么。 问题答案: 问题是“非”语义。“不需要”不表示“禁止