Apache Ignite.NET LINQ Failure

Использование Apache Ignite .NET 2.3.0

Попытка поиска с использованием расширения Linq (Apache.Ignite.Linq).

Вот IgniteConfig:

{
    ClientMode = false,
    JvmInitialMemoryMb = 512,
    JvmMaxMemoryMb = 512,
    MetricsLogFrequency = TimeSpan.Zero, // disable metrics output
    DataStorageConfiguration = new Apache.Ignite.Core.Configuration.DataStorageConfiguration()
    {
        DefaultDataRegionConfiguration = new DataRegionConfiguration()
        {
            Name = "DefaultRegion",
            PersistenceEnabled = true
        },
        StoragePath = _config.Value.Ignite.PersistentStoragePath
     },
     CacheConfiguration = new[]
     {
         new CacheConfiguration 
         {
             Name = "securitiesItemsCache",
             ReadThrough = false,
             WriteThrough = false,
             CacheMode = CacheMode.Replicated,
             DataRegionName = "DefaultRegion",
             QueryEntities = new []
             {
                  new QueryEntity(typeof(string), typeof(SecuritiesItem))
             }
         }

    }

Получение кеша:

_securitiesCache = _ignite.GetOrCreateCache<string, SecuritiesItem>("securitiesItemsCache");

Искать вот так:

_securitiesCache
    .AsCacheQueryable()
    .Where(s => s.Value.SearchString.Contains(query))
    .ToArray()
    .Select(x => x.Value);

В этом случае получите исключение:

Apache.Ignite.Core.Common.IgniteException HResult = 0x80131500
Сообщение = Не удалось проанализировать запрос: выберите _T0._KEY, _T0._VAL из "securitiesItemsCache".SECURITIESITEM как _T0, где (_T0.SearchString подобно '%' ||? || '%') Source=Apache.Ignite.Core StackTrace: в Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.Error(Void* target, Int32 errType, SByte* errClsChars, Int32 errClsCharsLen, SByte* errMsgChars, Int32 errMsgCharsLenTerLDLRTTTTTTLTTTTTTTTTTTTTTTTTTTTTTT) в Apache.Ignite.Core.Impl.Unmanaged.IgniteJniNativeMethods.TargetInStreamOutObject(Void* ctx, Void* target, Int32 opType, Int64 memPtr) в Apache.Ignite.Core.Impl.PlatformJniTarget.Bject1 writeAction) at Apache.Ignite.Core.Impl.Cache.CacheImpl2.QueryFields [T] (SqlFieldsQuery qry, Func3 readerFunc) at Remotion.Linq.Clauses.StreamedData.StreamedSequenceInfo.ExecuteQueryModel(QueryModel queryModel, IQueryExecutor executor) at Apache.Ignite.Linq.Impl.CacheFieldsQueryProvider.Execute[TResult](Expression expression) at Remotion.Linq.QueryableBase1.GetEnumerator () в System.Collections.Generic.LargeArrayBuilder1.AddRange(IEnumerable1 элементов) в System.Collections.Generic.EnumerableHelpers.ToArray [T] (IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 источник) в Core.IgniteServer.SearchSecurities(строковый запрос) в C:\development\ISSDPService\Core\IgniteServer.cs: строка 138 в WebService.Providers.IgniteProvider.Search(строковый запрос, LanguagePrefix lang) в C:\development\ISSDPService\WebService\Providers\IgniteProvider.cs: строка 78 в WebService.Controllers.SecuritiesController.Search(строковый запрос) в C:\development\ISSDPService\WebService\Controllers\SecuritiesController.cs: строка 47 в Microsoft.Extensions.Metbject.ject.ject.Execute (Цель объекта, Параметры объекта []) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext()

Внутреннее исключение 1: JavaException: класс org.apache.ignite.IgniteCheckedException: не удалось проанализировать запрос: выберите _T0._KEY, _T0._VAL из "securitiesItemsCache".SECURITIESITEM как _T0, где (_T0.SearchString как '%' ||? || '%') в org.apache.ignite.internal.processors.platform.utils.PlatformUtils.unwrapQueryException(PlatformUtils.java:519) в org.apache.ignite.internal.processors.platform.cache.PlatformCache.runFieldsQuery(PlatformCache. Java:1240) в org.apache.ignite.internal.processors.platform.cache.PlatformCache.processInStreamOutObject(PlatformCache.java:877) в org.apache.ignite.internal.processors.platform.PlatformTargetProxyImpl.intreamTmp.Impl.TjTOutOut 79) Вызвано: javax.cache.CacheException: класс org.apache.ignite.internal.processors.query.IgniteSQLException: Не удалось проанализировать запрос: выберите _T0._KEY, _T0._VAL из "securitiesItemsCache".SECURITIESITEM как _T0, где (_T.SearchString как '%' ||? || '%') в org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:597) в org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:368) в org.apache.ignite.internal.formcore.inlatlatformCachep.runFieldsQuery(PlatformCache.java:1234) ... еще 2 Причины: class org.apache.ignite.internal.processors.query.IgniteSQLException: Не удалось проанализировать запрос: выберите _T0._KEY, _T0._VAL из "securitiesItemsCache".SECURITIESITEM. как _T0, где (_T0.SearchString как '%' ||? || "%") в org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:1385) в org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyxx ($ 5.apply:1909) в org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:1907) в org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.j::: в org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2445) в org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryg.or.19).ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:585) ... еще 4 причины: org.h2.jdbc.JdbcSQLException: Столбец "_T0.SEARCHSTRING" не найден Колонка "_T0SE" найденный; Оператор SQL: выберите _T0._KEY, _T0._VAL из "securitiesItemsCache".SECURITIESITEM как _T0, где (_T0.SearchString похоже на '%' ||? || '%') [42122-195] в org.h2.message.DbException.getJdbcSQLException(DbException.java:345) в org.h2.message.DbException.get(DbException.java:179) в org.h2.message.DbException.get(DbException.java:155) в org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:147) в org.h2.expression.CompareLike.optimize(CompareLike.java:93) в org.h2.command.dml.Select.prepare(Select.java:842) в org.h2.command.Parser.prepareCommand(Parser.java:262) в org.h2.engine.Session.prepareLocal(Session.java:573) в org.h2.engine.Session.prepareCommand(Session.java:514) в орг.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1204) в org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:73) в org.h2.jdbc.JdbcConnection.jd.jd.jg.jp.jp.jp.jp.jp.jp.jp.jp.jp.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepareStatement(IgniteH2Indexing.java:402) at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:1365) ... еще 10

это говорит:

Столбец "_T0.SEARCHSTRING" не найден; Оператор SQL:

Но это не new QueryEntity(typeof(string), typeof(SecuritiesItem)) достаточно ли этого?

Постановили

Добавлено описание для поля программно:

Fields = new []
{
    new QueryField { Name = "SearchString", FieldType = typeof(string)}
}

Еще одна проблема.

Это отличный поиск, если запрос состоит только из английских букв. Но если я введу русские символы, то ничего не найду. Должен ли я преобразовать текст в определенную кодировку?

1 ответ

Решение

Column "_T0.SEARCHSTRING" not found

Вы должны отметить SearchString собственность с [QuerySqlField],

SQL включен, вы должны явно указать, какие поля должны быть доступны в запросах. См. https://apacheignite-sql.readme.io/docs/net-schema-and-indexes.

Другие вопросы по тегам