lucene.net 3: объединить QueryParser и MultifieldQueryParser с fuzzyQuery - PullRequest
0 голосов
/ 31 августа 2018

Я только что нашел следующую подсказку: Объединение WildcardQuery от Lucene с FuzzyQuery - но из-за того, что я очень плохо знаком с люценом, я не смог выяснить, как это будет работать в моем случае

Я должен внедрить индексирование и поиск Lucene в системе, которая связана с Lucene.net версии 3.0.3 (из-за фреймворка, на который опирается система)

Мне уже удалось построить индекс Lucene и выполнить поиск, который в основном основан на подстановочных знаках и одном или нескольких полях поиска.

Как я могу добавить нечеткость к результатам моего существующего поискового механизма? Я просто хочу передать дополнительный параметр "maxdistance" в функцию поиска, которая определяет максимальное расстояние, которое может иметь соответствие слов.

Это моя функция поиска:

Private Shared Function _search(ByVal searchQuery As String, Optional ByVal searchFields As String = "", Optional maxResults As Integer = 10) As IEnumerable(Of ItemWithDetailObj)

If String.IsNullOrEmpty(searchQuery.ToLower.Replace("*", "").Replace("?", "").Replace("+", "").Replace("&&", "").Replace("||", "")) Then
    ' invalid or empty search term - return empty object
    Return New List(Of ItemWithDetailObj)()
End If

' set up lucene searcher
Using searcher = New IndexSearcher(_directory, False)
    Dim hits_limit = maxResults
    Dim analyzer = New StandardAnalyzer(Version.LUCENE_30)

    ' search by field(s) ?
    Dim multi As Boolean = False
    Dim fieldsArray As String() = {}

    If searchFields = "" Then
        ' search all fields
        multi = True
        fieldsArray =
        {
            "Item_ID",
            "Item_Title"
            "Item_Status",
            "Data_01",
            "Data_02"
        }
    Else
        ' search by one or multiple fields
        If searchFields.IndexOf(",") < 1 Then
            ' search by single field
            multi = False
        Else
            ' search multiple fields
            multi = True
            ' define fields to search
            fieldsArray = searchFields.Split(",")
        End If

    End If

    If multi = True Then                        
        Dim parser As MultiFieldQueryParser
        parser = New MultiFieldQueryParser(Version.LUCENE_30, fieldsArray, analyzer)
        parser.AllowLeadingWildcard = True

        Dim query = parseQuery(searchQuery.ToLower, parser)
        Dim hits = searcher.Search(query, Nothing, hits_limit, Sort.RELEVANCE).ScoreDocs
        Dim results = _mapLuceneToDataList(hits, searcher)
        analyzer.Close()
        searcher.Dispose()
        Return results
    Else
        Dim parser = New QueryParser(Version.LUCENE_30, searchFields, analyzer)
        parser.AllowLeadingWildcard = True
        Dim query = parseQuery(searchQuery.ToLower, parser)
        Dim hits = searcher.Search(query, hits_limit).ScoreDocs
        Dim results = _mapLuceneToDataList(hits, searcher)
        analyzer.Close()
        searcher.Dispose()
        Return results
    End If
End Using

End Function

Заранее спасибо за любую помощь

Don

...