Я только что нашел следующую подсказку:
Объединение 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