代码之家  ›  专栏  ›  技术社区  ›  Joseph Ferris

Lucene索引和查询设计问题-搜索人

  •  0
  • Joseph Ferris  · 技术社区  · 15 年前

    我最近刚开始与Lucene(特别是lucene.net)合作,并成功地创建了几个起诉状,对其中任何一个都没有问题。在与Endeca合作之前,我发现Lucene重量轻、功能强大,而且学习曲线要低得多(主要是由于一个简洁的API)。

    但是,我有一个特定的索引/查询情况,我在处理这些情况时遇到了一些问题。我有个人目录。在这个应用程序中可以搜索人员,目的是返回精确匹配和近似匹配。现在,在索引中,我将“firstname”和“lastname”连接到一个名为“fullname”的字段中,在两个字段之间添加一个空格。因此,名字:jon,姓:smith,产生全名:jon smith。我确实预料到中间名和后缀的可能性,但这目前并不重要。

    我想对这个名字做一个模糊的搜索,所以搜索“约翰·史密斯”的人仍然会得到“乔恩·史密斯”。不过,我曾经考虑过多搜索,如果他的名字实际上是“乔恩·德尔·卡门”或“乔恩·保罗·德尔·卡门”,这就更复杂了。我不知道用户输入什么来描述名字或姓氏片段。

    唯一的想法是我可以用一个不会被丢弃的字符替换连接值中的空格。如果我在为索引构建文档以及解析查询时这样做,我可以将其视为一个更大的单词,对吗?有没有另外一种方法可以同时用于简单的名字(“乔恩·史密斯”)和更复杂的名字(“乔恩·保罗·德尔·卡门”)?

    任何建议都会受到赞赏。事先谢谢!

    编辑:其他细节如下。

    在卢克,我提出了以下问题:

    FullName:jonn smith~
    

    它被解析为:

    FullName:jonn CreatedOn:smith~0.5
    

    解释如下:

    BooleanQuery:boost=1.0000
        clauses=2, maxClauses=1024
        Clause 0: SHOULD
            TermQuery:boost=1.0000
                Term: field='FullName' text='jonn'
        Cluase 1: SHOULD
            FuzzyQuery: boost=1.0000
                prefixLen=0, minSimilarity=0.5000
                org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000
                FilteredTermEnum: Exception null
    

    “createdon”是索引中的另一个字段。我试着在“jonn smith”这个词周围加引号,但它把它当作短语查询来处理。我确信问题是我做的事情不正确,但我对这一切都很冷淡,我不确定这到底是什么。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Joseph Ferris    15 年前

    我的问题是如何建立索引。我最后做的是确保它没有标记化全名,查询开始返回正确的结果。上面的解释结果是由于我的一个ID10T错误,现在返回正确。