【问题标题】:Lucene - Search for multiple associated valuesLucene - 搜索多个关联值
【发布时间】:2018-10-28 21:03:15
【问题描述】:

我想索引和搜索使用 Lucene 索引的数据片段。

例如物品及其颜色

Item 1 - Black
Item 2 - Yellow
Item 3 - Red

搜索示例

搜索词 - Item

Item 1 - Black
Item 2 - Yellow
Item 3 - Red

搜索词 - Item 1

Item 1 - Black

搜索词 - Item 2 - Yellow

Item 2 - Yellow

可能的解决方案

根据我在this 的答案中找到的内容,显然我可以使用这种格式将这些添加到字段中。

// {Item 1}|{Black}
document.add(new StringField("item", MessageFormat.format("'{'{0}'}'|'{'{1}'}'", itemName, itemColour, Field.Store.YES));

如果我现在用这种格式的数据进行搜索,我不会得到任何结果。

我正在使用StandardAnalyzer

这就是我创建查询的方式。

QueryParser queryParser = new QueryParser("item", analyzer);
queryParser.setAllowLeadingWildcard(true);
Query query = queryParser.parse(keyword);

我想搜索:

  1. 具有匹配名称的所有项目
  2. 所有匹配且具有特定颜色的商品

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: java indexing lucene


    【解决方案1】:

    如果您想在未来建立其他可能的搜索,我会建议文档采用不同的结构。这里是抽象视图

    new StringField("number", number);
    new StringField("item", item);
    new StringField("color", color);
    

    除了这 3 个字段之外,您还可以添加一个用于全文搜索的字段,包括这三个字段的所有信息。这将由TextField See Lucene Field javadoc 完成

    new TextField("fulltext", item + " " + number + " " + "color");
    

    有了这个,您可以将全文搜索应用到“全文”字段,并可以直接对其他字段进行一些其他搜索。

    最后一件事:

    queryParser.setAllowLeadingWildcard(true);

    你真的要允许这样做吗?这可能会对性能产生影响,并可能导致意外的搜索行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多